如何在过去的特定时间使用UTC创建Date对象?

时间:2018-01-31 18:25:13

标签: java date utc

是否有可能在一小时前或一天前创建一个保证为UTC且在过去特定时间的System.currentTimeMillis()对象,这是一个好主意吗?

我查看了Stack Overflow问题 "Learning Linux Binary Analysis" by Ryan "elfmaster" O'Neill及其答案。但我希望避免添加更多依赖项,例如TextBlock2,并且接受的答案使用TextBlock2这将是本地时区,不是吗?

2 个答案:

答案 0 :(得分:5)

您可以使用java.time包实现此目的,如下所示:

LocalDateTime localDateTime = LocalDateTime.now(ZoneOffset.UTC).minusHours(4);
Date date = Date.from(localDateTime.atZone(ZoneOffset.UTC).toInstant());

提供以下输出:

2018-01-31T14:58:28.908
Wed Jan 31 20:28:28 IST 2018     //20:28:28 IST is 14:58:28 UTC

在我当前时间4+5:30之后Asia/Kolkata ZoneId小时正确POST request

答案 1 :(得分:4)

正如评论中生动地讨论的那样,建议使用java.time包。简单的解决方案:

Instant fourHoursAgo = Instant.now().minus(Duration.ofHours(4));
System.out.println(fourHoursAgo);

这只是打印

2018-01-31T14:57:44.667255Z

由于UTC时间现在为18:58,因此输出就是您要求的。 Instant本身偏向中性。它的toString以UTC格式提供时间,但在生成Instant时没有提及UTC,所以不管它给你你想要的东西,我都不确定。我稍后会在UTC中给你一个显式的结果。

但首先,如果您确实需要java.util.Date,通常是您无法更改的旧版API,转换很简单:

Date oldfashionedDate = Date.from(fourHoursAgo);
System.out.println(oldfashionedDate);

在我Europe/Copenhagen时区的计算机上打印:

Wed Jan 31 15:57:44 CET 2018

同样,这与运行代码段前四小时的时间一致。同样,Date中没有UTC偏移量。只有它的toString方法抓取我的JVM的时区设置并使用它来生成字符串,这不会影响Date。请参阅Stack Overflow问题,How to set time zone of a java.util.Date?及其答案。

正如所承诺的,如果您确实需要不仅代表时间而且还需要代表偏移量,请使用OffsetDateTime

OffsetDateTime fourHoursAgoInUtc = OffsetDateTime.now(ZoneOffset.UTC).minusHours(4);
System.out.println(fourHoursAgoInUtc);

此印刷

2018-01-31T14:57:44.724147Z
最后的

Z表示从UTC或“祖鲁时区”(这不是真正的时区)偏移零。转换为Date并不比以前复杂得多,但同样,您将失去转化中的偏移信息:

Date oldfashionedDate = Date.from(fourHoursAgoInUtc.toInstant());
System.out.println(oldfashionedDate);

打印出来:

Wed Jan 31 15:57:44 CET 2018

链接: Oracle tutorial explaining how to use java.time