如何在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
小时。 Instant
和ZonedDateTime
都代表了同一时刻,只是通过两个不同的镜头观看。
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();