我想从 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个伪区仅代表了夏令时(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 关闭为标准时间。
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);