从 String 创建一个 ZonedDateTime 的实例,与 String [Java] 的时间相同

问题描述

我想从 String 创建一个 zoneddatetime 实例。我想让“2021-03-18 8:00:00”变成“2021-03-18 8:00:00 EST”。我不希望意外的变量通过将 8:00:00 转换为与显示的时间不同的时间来干扰。即从 8:00:00 到 17:00:00。

我用来尝试转换它的代码是:

    SimpleDateFormat estForm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    estForm.setTimeZone(TimeZone.getTimeZone("EST"));
    String start = "2021-03-18 08:00:00";

    Date estDT = estForm.parse(start);

    final ZoneId zoneEST = ZoneId.of("US/Eastern");

    zoneddatetime zoneEst = zoneddatetime.ofInstant(estDT.toInstant(),zoneEST);

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    System.out.println(zoneEST);
    System.out.println(zoneEst);

这是我从中得到的最后一个输出

US/Eastern
2021-03-18T09:00-04:00[US/Eastern]

解决方法

嗯,你可以简单地做:

"2021-03-18 08:00:00" + " EST"

如果要将输入视为逻辑日期时间值,请解析为 LocalDateTime。这种类型是合适的,因为您的输入缺少时区或UTC 偏移量指标。

然后调用 atZone 将该日期与时间放入时区的上下文中。 EST 不是时区。这样的 2-4 个伪区域仅代表了 Daylight Saving Time (DST) 是否为效应的一个大致概念,甚至只是一个区域的一个大致概念,并不精确。也不是标准化的,甚至不是唯一的。

我猜你想要纽约时间。

LocalDateTime
.parse( 
    "2021-03-18 08:00:00".replace( " ","T" ) 
)                                                // Returns a `LocalDateTime` object.
.atZone(
    ZoneId.of( "America/New_York" ) 
)                                                // Returns a `ZonedDateTime` object.

通常最好让 DateTimeFormatter 在生成文本时自动本地化,通过 `ofLocalized... 方法。但是如果你坚持你的特定方法,定义一个格式模式。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss z" ) ;
String output = zdt.format( f ) ;

将代码放在一起。

        ZonedDateTime zdt = 
            LocalDateTime
            .parse( "2021-03-18 08:00:00".replace( " ","T" ) )
            .atZone(
                ZoneId.of( "America/New_York" ) 
            )
        ;

        DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss z" ) ;
        String output = zdt.format( f ) ;

看到这个code run live at IdeOne.com

2021-03-18 08:00:00 EDT

正如我们在该输出中看到的,您想要的 EST 不正确,因为纽约时间在此日期时间前几天将夏令时关闭为标准时间。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...