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

Pat*_*fer 3 java date utc

是否有可能创建一个java.util.Date保证为UTC 的对象,并且在过去的特定时间,例如一小时前或一天前,这是一个好主意吗?

我已经回顾了截至4小时前的Stack Overflow问题 获取日期及其答案.但是我想避免添加更多依赖项,例如jodaTime,并且接受的答案使用System.currentTimeMillis()哪个是本地时区,不是吗?

Ole*_*.V. 7

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

Instant fourHoursAgo = Instant.now().minus(Duration.ofHours(4));
System.out.println(fourHoursAgo);
Run Code Online (Sandbox Code Playgroud)

这个刚打印

2018-01-31T14:57:44.667255Z
Run Code Online (Sandbox Code Playgroud)

由于 UTC 时间 now 18:58,输出就是您要求的。在Instant本身偏移中性。它toString以 UTC 时间提供时间,但在生成Instant. 稍后我会给你一个明确在 UTC 中的结果。

但首先,如果您确实需要一个java.util.Date,通常用于您无法更改的遗留 API,转换很容易:

Date oldfashionedDate = Date.from(fourHoursAgo);
System.out.println(oldfashionedDate);
Run Code Online (Sandbox Code Playgroud)

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

Wed Jan 31 15:57:44 CET 2018
Run Code Online (Sandbox Code Playgroud)

同样,这与运行代码段前四小时的时间一致。同样, aDate中没有 UTC 偏移量。只有它的toString方法获取我 JVM 的时区设置并将其用于生成字符串,这不会影响Date. 请参阅堆栈溢出问题,如何设置 java.util.Date 的时区?,以及它的答案。

正如承诺的那样,如果您不仅需要表示时间还需要表示偏移量,请使用OffsetDateTime

OffsetDateTime fourHoursAgoInUtc = OffsetDateTime.now(ZoneOffset.UTC).minusHours(4);
System.out.println(fourHoursAgoInUtc);
Run Code Online (Sandbox Code Playgroud)

这印

2018-01-31T14:57:44.724147Z
Run Code Online (Sandbox Code Playgroud)

Z最后意味着从 UTC 或“祖鲁时区”(这不是真正的时区)偏移零。到 a 的转换Date并没有比以前复杂多少,但同样,您将在转换中丢失偏移信息:

Date oldfashionedDate = Date.from(fourHoursAgoInUtc.toInstant());
System.out.println(oldfashionedDate);
Run Code Online (Sandbox Code Playgroud)

这打印:

Wed Jan 31 15:57:44 CET 2018
Run Code Online (Sandbox Code Playgroud)

链接: 解释如何使用的 Oracle 教程java.time


Pan*_*hal 5

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

LocalDateTime localDateTime = LocalDateTime.now(ZoneOffset.UTC).minusHours(4);
Date date = Date.from(localDateTime.atZone(ZoneOffset.UTC).toInstant());
Run Code Online (Sandbox Code Playgroud)

给出以下输出:

2018-01-31T14:58:28.908
Wed Jan 31 20:28:28 IST 2018     //20:28:28 IST is 14:58:28 UTC
Run Code Online (Sandbox Code Playgroud)

这正是4+5:30我目前时间的正好数小时 - Asia/Kolkata ZoneId.

  • 它是您编辑的答案中的第一个代码不起作用.它给你14:56:24 IST,它不同意14:56:24 UTC,这本来是正确的.这是`Date.toString()`愚弄你. (3认同)