繁体   English   中英

来自ZonedDateTime瞬间的日期不在UTC中

[英]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中有当前时间。

两点:

  1. 避免使用过长的Date类,尤其是当您已经在使用现代Java日期和时间API java.time类时。
  2. 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的全部内容

正如我所展示的,格式化日期时间时,格式化程序可能会将时区或偏移量放入字符串中 这不会以任何方式修改日期时间对象,无论是OffsetDateTimeZonedDateTimeInstant还是Date 过长的DateFormat类在格式化Date时可能会做同样的事情。 它不能也不会在Date对象中设置时区,因为(并且我重复), Date对象中不能包含时区。

长话短说,我不需要看到过时的Date类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM