Java 8 将 UTC 时间转换为 EDT/EST 以便日期保持不变
Java 8 Convert UTC time to EDT/EST so that date remains the same
我正在为 java 中的变量使用 ZonedDateTime。
我想将变量的值(默认 UTC 时区)转换为 "America/New York" 时区,以便日期保持不变。
示例 4:00 上午 UTC = 12:00 上午 EST。从 ZonedDateTime 变量中添加或减去小时数,这样日期就不会更改。
我们怎样才能实现这种转换?
如果你想合并 UTC 日期和 EST 时间,你可以这样做:
ZonedDateTime utc = ...
ZonedDateTime est = utc.withZoneSameInstant(ZoneId.of("America/New_York"));
ZonedDateTime estInSameDay = ZonedDateTime.of(utc.toLocalDate(), est.toLocalTime(), ZoneId.of("America/New_York"));
保持日期不变,我认为这可行
ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC);
ZonedDateTime est = utc.plusHours(5); //normally est is 5 hours ahead
您可以通过转换为 LocalDateTime 并返回到指定时区的 ZonedDateTime 来实现:
ZonedDateTime zoned = ZonedDateTime.now();
LocalDateTime local = zoned.toLocalDateTime();
ZonedDateTime newZoned = ZonedDateTime.of(local, ZoneId.of("America/New_York"));
如果您的 UTC 时间不需要时区信息,那么您最好使用 Instant
class。使用Instant
对象,您可以轻松转换到指定时区的ZonedDateTime
:
Instant instant = Instant.parse("2018-10-02T04:00:00.0Z");
ZonedDateTime nyTime = instant.atZone(ZoneId.of("America/New_York"));
//2018-10-02 00:00:00
我正在为 java 中的变量使用 ZonedDateTime。
我想将变量的值(默认 UTC 时区)转换为 "America/New York" 时区,以便日期保持不变。
示例 4:00 上午 UTC = 12:00 上午 EST。从 ZonedDateTime 变量中添加或减去小时数,这样日期就不会更改。
我们怎样才能实现这种转换?
如果你想合并 UTC 日期和 EST 时间,你可以这样做:
ZonedDateTime utc = ...
ZonedDateTime est = utc.withZoneSameInstant(ZoneId.of("America/New_York"));
ZonedDateTime estInSameDay = ZonedDateTime.of(utc.toLocalDate(), est.toLocalTime(), ZoneId.of("America/New_York"));
保持日期不变,我认为这可行
ZonedDateTime utc = ZonedDateTime.now(ZoneOffset.UTC);
ZonedDateTime est = utc.plusHours(5); //normally est is 5 hours ahead
您可以通过转换为 LocalDateTime 并返回到指定时区的 ZonedDateTime 来实现:
ZonedDateTime zoned = ZonedDateTime.now();
LocalDateTime local = zoned.toLocalDateTime();
ZonedDateTime newZoned = ZonedDateTime.of(local, ZoneId.of("America/New_York"));
如果您的 UTC 时间不需要时区信息,那么您最好使用 Instant
class。使用Instant
对象,您可以轻松转换到指定时区的ZonedDateTime
:
Instant instant = Instant.parse("2018-10-02T04:00:00.0Z");
ZonedDateTime nyTime = instant.atZone(ZoneId.of("America/New_York"));
//2018-10-02 00:00:00