例如,我有一个ISO字符串“2022-12- 22 T18:20:00.000”和一个时区字符串“US/Eastern”,如何使用Java将它们转换为相同格式(ISO 8601)的UTC时间?
icnyk63a1#
我不在电脑前测试但我想这个可能有用...
final ZonedDateTime usEastern = LocalDateTime.parse("2022-12-22T18:20:00.000", DateTimeFormatter.ISO_DATE_TIME) .atZone(ZoneId.of("US/Eastern")); final ZonedDateTime utc = usEastern.withZoneSameInstant(ZoneId.of("UTC"));
xurqigkl2#
accepted answer是正确的,但有几件事是重要的,为未来的游客到这个页面。
DateTimeFormatter
java.time API基于ISO 8601,因此您无需指定DateTimeFormatter来解析已采用ISO 8601格式的日期-时间字符串(例如,您的日期-时间字符串2015-03-21T11:08:14.859831)。
java.time
2015-03-21T11:08:14.859831
ZonedDateTime
Instant
一旦将从给定日期时间字符串解析的LocalDateTime转换为ZonedDateTime,我建议您从ZonedDateTime中得到Instant,Instant是时间轴上的瞬时点,通常使用UTC时间刻度表示。
LocalDateTime
正如您在List of tz database time zones中所发现的,* US/Eastern * 已被弃用。我建议您避免使用 * US/Eastern *,而使用 * America/New_York *。
import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.List; class Main { public static void main(String[] args) { ZoneId zone = ZoneId.of("America/New_York"); ZonedDateTime zdt = LocalDateTime.parse("2022-12-22T18:20:00.000") .atZone(zone); // Alternatively // zdt = ZonedDateTime.of(LocalDateTime.parse("2022-12-22T18:20:00.000"), zone); Instant instant = zdt.toInstant(); System.out.println(instant); } }
2022-12-22T23:20:00Z
ONLINE DEMO从**Trail: Date Time**了解有关现代日期-时间API的更多信息。
2条答案
按热度按时间icnyk63a1#
我不在电脑前测试但我想这个可能有用...
xurqigkl2#
accepted answer是正确的,但有几件事是重要的,为未来的游客到这个页面。
不需要指定
DateTimeFormatter
java.time
API基于ISO 8601,因此您无需指定DateTimeFormatter
来解析已采用ISO 8601格式的日期-时间字符串(例如,您的日期-时间字符串2015-03-21T11:08:14.859831
)。从
ZonedDateTime
中获取Instant
一旦将从给定日期时间字符串解析的
LocalDateTime
转换为ZonedDateTime
,我建议您从ZonedDateTime
中得到Instant
,Instant
是时间轴上的瞬时点,通常使用UTC时间刻度表示。* 美国/东部 * 已弃用
正如您在List of tz database time zones中所发现的,* US/Eastern * 已被弃用。我建议您避免使用 * US/Eastern *,而使用 * America/New_York *。
ONLINE DEMO
从**Trail: Date Time**了解有关现代日期-时间API的更多信息。