如何在 Java8中获得 UTC + 0日期?

我在 Java 中的 Date 类有问题。 Date 类返回本地机器日期,但是我需要 UTC-0。

我在谷歌上搜索并找到了很棒的 JavaScript 解决方案,但是对于 Java 来说没有什么有用的东西。

如何在 Java8中获得 UTC + 0日期?

192884 次浏览

用 Java8你可以写:

OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);

为了回答你的评论,你可以将它转换成 Date (除非你依赖于遗留代码,我看不出有什么理由)或者 Millis,从那个时代开始:

Date date = Date.from(utc.toInstant());
long epochMillis = utc.toInstant().toEpochMilli();

在 Java8中,您使用新的 TimeAPI,并使用 世界协调时时区马上转换为 ZonedDateTime

在 java8中,我将使用 Instant类,它已经在 协调世界时中,并且使用起来很方便。

import java.time.Instant;


Instant ins = Instant.now();
long ts = ins.toEpochMilli();


Instant ins2 = Instant.ofEpochMilli(ts)

你亦可使用以下方法:

import java.time.*;


Instant ins = Instant.now();


OffsetDateTime odt = ins.atOffset(ZoneOffset.UTC);
ZonedDateTime zdt = ins.atZone(ZoneId.of("UTC"));

回到 Instant

Instant ins4 = Instant.from(odt);

博士

Instant.now()

爪哇时间

与 Java 最早版本捆绑在一起的令人头疼的旧日期时间类已经被构建到 Java8及更高版本中的 爪哇时间类所取代。见 Oracle 教程。许多功能已经在 310-后端口中回移植到 Java6和 Java7,并在 三个十分中进一步适应了 Android。

Instant

协调世界时中,Instant代表时间线上的一个时刻,其分辨率高达 纳秒

Instant instant = Instant.now();

toString方法生成一个 String 对象,其中的文本使用标准 ISO 8601格式之一表示日期时间值。

String output = instant.toString();

2016-06-27T19:15:25.864 Z

Instant类是 java.time 中的一个基本构造块类。在处理日期时间时,这应该是您的首选类,通常最佳实践是以 UTC 格式跟踪、存储和交换日期时间值。

OffsetDateTime

但是 Instant有一些局限性,比如没有用于生成替代格式的字符串的格式选项。为了获得更大的灵活性,请将 Instant转换为 OffsetDateTime。指定 从协调世界时偏移。在 java.time 中,这意味着一个 ZoneOffset对象。在这里,我们要坚持使用 UTC (+ 00) ,这样我们就可以使用方便的常量 ZoneOffset.UTC

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

2016-06-27T19:15:25.864 Z

或者跳过 Instant课程。

OffsetDateTime.now( ZoneOffset.UTC )

现在有了 OffsetDateTime对象,您可以使用 DateTimeFormatter创建具有替代格式的文本的 String 对象。在 Stack Overflow 中搜索许多使用 DateTimeFormatter的示例。

ZonedDateTime

当您想要显示某个特定时区的 挂钟时间时,应用一个 ZoneId来获得一个 ZonedDateTime

在这个例子中,我们应用蒙特利尔时区。在夏季,根据 夏时制废话,区有一个偏移的 -04:00。因此请注意,输出中的时间提前了4个小时,15小时而不是 19小时。InstantZonedDateTime都代表同一个时刻,只是通过两个不同的镜头观察。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

2016-06-27T15:15:25.864-04:00[美国/蒙特利尔]

转换

虽然应该避免使用旧的日期时间类,但是如果必须使用添加到旧类中的新方法,则可以进行转换。这里我们使用 java.util.Date.from( Instant )java.util.Date::toInstant

java.util.Date utilDate = java.util.Date.from( instant );

然后往另一个方向走。

Instant instant= utilDate.toInstant();

类似地,寻找添加到 GregorianCalendar(Calendar的子类)的新方法,以便在 java.time.ZonedDateTimejava.time.ZonedDateTime之间进行转换。

Table of types of date-time classes in modern java.time versus legacy.

关于 爪哇时间

< em > java.time 框架内置于 Java8及更高版本中。这些类取代了令人讨厌的旧的 遗产日期时间类,如 java.util.DateCalendarSimpleDateFormat

要了解更多,请参阅 < em > Oracle 教程 。并搜索堆栈溢出许多例子和解释。规范是 JSR 310

现在在 维修模式中的 尤达时间项目建议迁移到 爪哇时间类。

您可以直接与数据库交换 爪哇时间对象。使用与 JDBC 4.2或更高版本兼容的 JDBC 驱动程序。不需要字符串,不需要 java.sql.*类。Hibernate 5 & JPA 2.2支持 爪哇时间

从哪里获得 java.time 类?

我在我的项目中就是这么做的,效果非常好

Date now = new Date();
System.out.println(now);
TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // The magic is here
System.out.println(now);