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

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

我GOOGLE了,find了很好的JavaScript解决scheme,但没有用的Java。

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

使用Java 8,您可以编写:

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

为了回答您的评论,您可以将其转换为date(除非您依赖遗产代码,我没有看到任何理由)

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

TL;博士

 Instant.now() 

java.time

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

Instant

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

 Instant instant = Instant.now(); 

toString方法使用标准ISO 8601格式之一生成一个带有表示date时间值的文本的String对象。

 String output = instant.toString(); 

2016-06-27T19:15:25.864Z

Instant类是java.time中的基本构build块类。 在处理date时间时,这应该是您的上课,因为通常情况下最好的做法是跟踪,存储和交换UTC中的date时间值。

OffsetDateTime

Instant有限制,如没有格式化选项生成替代格式的string。 为了更加灵活,从Instant转换到OffsetDateTime 。 从UTC指定偏移量 。 在java.time中,这意味着一个ZoneOffset对象。 这里我们要坚持使用UTC(+00),所以我们可以使用方便的常量ZoneOffset.UTC

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

2016-06-27T19:15:25.864Z

现在使用OffsetDateTime对象,可以使用DateTimeFormatter创build具有不同格式文本的String对象。 search堆栈溢出了很多使用DateTimeFormatter例子。

ZonedDateTime

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

在这个例子中,我们应用蒙特利尔时区。 在夏季,在夏令时(DST)废话下,该区域的偏移量为-04:00 。 所以请注意,时间是如何在产量提前四小时,而不是19小时。 InstantZonedDateTime都代表了同一时刻,只是通过两个不同的镜头观看。

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

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

转换

虽然你应该避免旧的date时间类,如果你一定要转换使用新的方法添加到旧的类。 这里我们使用java.util.Date.from( Instant )java.util.Date::toInstant

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

并走向另一个方向。

 Instant instant= utilDate.toInstant(); 

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

在java8中,我将使用具有方法的Instant类在特定时刻创build类似Date的实例。

 import java.time.Instant; import java.time.Clock; Instant ins = Instant.now(Clock.systemUTC()); long ts = ins.toEpochMilli(); Instant ins2 = ins.ofEpochMilli(ts) 

或者,您可以使用以下内容:

 import java.time.ZoneId; import java.time.ZoneOffset; Instant ins = Instant.now(); Instant ins3 = Instant.from(ins.atOffset(ZoneOffset.UTC)); Instant ins4 = Instant.from(ins.atZone(ZoneId.of("UTC"))); long ts3 = ins3.toEpochMilli(); long ts4 = ins4.toEpochMilli();