如何解决从 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
不正确,因为纽约时间在此日期时间前几天将夏令时关闭为标准时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。