如何在Java 8中获取UTC + 0日期?tl;博士java.time关于 java.time

2022-08-31 08:25:39

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

我已经谷歌搜索并找到了JavaScript的出色解决方案,但对于Java来说没有任何用处。

如何在Java 8中获取UTC + 0日期?


答案 1

tl;博士

Instant.now()

java.time

与最早版本的Java捆绑在一起的麻烦的旧日期时间类已被Java 8及更高版本中内置的java.time类所取代。请参阅 Oracle 教程。大部分功能已经移植到ThreeTen-Backport中的Java 6和7,并在ThreeTenABP中进一步适应Android。

Instant

即时UTC 表示时间轴上的某个时刻,分辨率最高可达纳秒

Instant instant = Instant.now();

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

String output = instant.toString();  

2016-06-27T10:15:25.864Z

该类是 java.time 中的基本构建块类。在处理日期时间时,这应该是您的首选课程,因为通常最佳做法是以 UTC 格式跟踪、存储和交换日期时间值。Instant

OffsetDateTime

但是有一些限制,例如没有用于生成备用格式字符串的格式选项。为了获得更大的灵活性,请从 转换为 OffsetDateTime。指定与 UTC 的偏移量。在java.time中,这意味着一个ZoneOffset对象。在这里,我们希望坚持使用UTC(+00),这样我们就可以使用方便的常量ZoneOffset.UTCInstantInstant

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

2016-06-27T10:15:25.864Z

或者跳过课程。Instant

OffsetDateTime.now( ZoneOffset.UTC )

现在,有了对象,您可以使用 DateTimeFormatter 创建包含替代格式文本的 String 对象。搜索堆栈溢出,了解许多使用 .OffsetDateTimeDateTimeFormatter

ZonedDateTime

如果要显示某个特定时区的挂钟时间,请应用 ZoneId 以获取 ZonedDateTime

在此示例中,我们应用蒙特利尔时区。在夏季,在夏令时 (DST) 废话下,该区域的偏移量为 。因此,请注意,一天中的时间在输出中比小时早四个小时,而不是几小时。 两者都代表了完全相同的同时时刻,只是通过两个不同的镜头来观察。-04:001519InstantZonedDateTime

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();

同样,查找添加到(子类 )以转换为 和 从 中转换的新方法。GregorianCalendarCalendarjava.time.ZonedDateTime

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

关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

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

从哪里获取 java.time 类?


答案 2

使用Java 8,您可以编写:

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

要回答您的评论,您可以将其转换为日期(除非您依赖于旧代码,我看不出任何原因)或自纪元以来的 millis:

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