从 String 创建 ZonedDateTime 实例,其时间与 String [Java]

问题描述 投票:0回答:2

我想从 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]
java timezone converters zoneddatetime string-to-datetime
2个回答
2
投票

嗯,你可以简单地这样做:

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

如果要将输入视为逻辑日期时间值,请解析为

LocalDateTime
。此类型是合适的,因为您的输入缺少时区指示符或与 UTC 的偏移量。

然后调用

atZone
将日期与时间放入时区的上下文中。
EST
不是时区。这样的2-4个伪区仅代表了夏令时(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 ) ;

查看此代码在 IdeOne.com 上实时运行

2021-03-18 08:00:00 美国东部时间

正如我们在该输出中看到的,您想要的

EST
不正确,因为纽约时间在此日期时间之前几天将 DST 关闭为标准时间。


0
投票
import java.time.ZonedDateTime;
import java.time.ZoneId;

ZoneId zoneId = ZoneId.of("US/Eastern");
ZonedDateTime zonedDateTime = ZonedDateTime.of(2024, 11, 14, 2, 11, 22, 123*1000000, zoneId);

System.out.println(zonedDateTime);
© www.soinside.com 2019 - 2024. All rights reserved.