[英]Date from ZonedDateTime instant not in utc
我正在创建这样的日期:
ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
Date.from(now.toInstant());
我需要Date对象在utc中具有当前时间,但是当我打印日期时,它给出了我的本地时间而不是utc时间。 我也尝试过:
OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
Date date = Date.from(now.toInstant());
但是当我再次打印日期时,时间不在utc中。 创建Date对象时,我做错什么了吗? 为什么上述2种方法没有给我Date,而UTC中有当前时间。
两点:
Date
类,尤其是当您已经在使用现代Java日期和时间API java.time
类时。 Date
对象还没有,并且不能有时区。 如果需要偏移量,则需要保留OffsetDateTime
(或ZonedDateTime
)对象:
OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
System.out.println(now);
在我的电脑上,这只是打印
2017-11-21T11:53:11.519Z
末尾的Z
表示Zulu时区,这是UTC的另一个名称(您也可以非正式地认为它是Z ero偏离UTC的时间)。
如果您希望使用更易理解的格式,那么使用格式器是正确的:
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
System.out.println(now.format(formatter));
根据您的语言环境和时间,它会显示类似
Tuesday, November 21, 2017 11:53:11 AM Z
同样, Z
表示祖鲁时区UTC。
Date
对您没有帮助 Date
只是时间点。 用于初始化日期的Instant
如此。 他们都没有时区或偏移量。 这里的区别是它们的toString
方法: Instant
始终以UTC打印, Date
通常(总是?)以JVM的默认时区打印。 后者使许多人误以为Date
没有时区。 请参阅有关java.util.Date的全部内容 。
正如我所展示的,格式化日期时间时,格式化程序可能会将时区或偏移量放入字符串中 。 这不会以任何方式修改日期时间对象,无论是OffsetDateTime
, ZonedDateTime
, Instant
还是Date
。 过长的DateFormat
类在格式化Date
时可能会做同样的事情。 它不能也不会在Date
对象中设置时区,因为(并且我重复), Date
对象中不能包含时区。
长话短说,我不需要看到过时的Date
类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.