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

问题描述 投票:80回答:4

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

我用Google搜索并找到了很好的JavaScript解决方案,但对Java来说没用。

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

java datetime java-8 java-time
4个回答
122
投票

使用Java 8,您可以编写:

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

要回答您的评论,您可以将其转换为日期(除非您依赖遗留代码,我没有看到任何理由)或者从时代开始将其转换为millis:

Date date = Date.from(utc.toInstant());
long epochMillis = utc.toEpochSecond() * 1000;

115
投票

tl;dr

Instant.now()

java.time

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

Instant

Instant代表UTC时间轴上的一个时刻,分辨率高达nanoseconds

Instant instant = Instant.now();

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

String output = instant.toString();  

2016-06-27t 19:15:兄弟.864克

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

OffsetDateTime

Instant有一些限制,例如没有用于生成替代格式字符串的格式化选项。要获得更多灵活性,请将Instant转换为OffsetDateTime。指定offset-from-UTC。在java.time中,这意味着一个ZoneOffset对象。在这里,我们希望坚持使用UTC(+00),以便我们可以使用方便的常量ZoneOffset.UTC

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

2016-06-27t 19:15:兄弟.864克

或者跳过Instant课程。

OffsetDateTime.now( ZoneOffset.UTC )

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

ZonedDateTime

当你想在某个特定的时区显示wall-clock time时,使用ZoneId来获得ZonedDateTime

在此示例中,我们应用蒙特利尔时区。在夏天,在Daylight Saving Time (DST)胡说八道,该区域有-04:00的偏移。所以请注意输出中的时间是四小时,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();

同样,寻找添加到GregorianCalendarCalendar的子类)的新方法来转换为java.time.ZonedDateTime和从java.time转换。


About java.time

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

现在在maintenance modejava.time项目建议迁移到Oracle Tutorial班。

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

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的java.sql.*。不需要字符串,不需要Java SE 8类。

从哪里获取java.time类?

Interval项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如YearWeekYearQuartermoreInstant


3
投票

在Java8中,您使用新的Time API,并将ZonedDateTime转换为UTC TimeZone使用Instant


-1
投票

在java8中,我将使用已经在UTC中的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);

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.