正如评论中生动地讨论的那样,建议使用该java.time包。简单的解决方案:
Instant fourHoursAgo = Instant.now().minus(Duration.ofHours(4));
System.out.println(fourHoursAgo);
这个刚打印
2018-01-31T14:57:44.667255Z
由于 UTC 时间 now 18:58,输出就是您要求的。在Instant本身偏移中性。它toString以 UTC 时间提供时间,但在生成Instant. 稍后我会给你一个明确在 UTC 中的结果。
但首先,如果您确实需要一个java.util.Date,通常用于您无法更改的遗留 API,转换很容易:
Date oldfashionedDate = Date.from(fourHoursAgo);
System.out.println(oldfashionedDate);
在我的Europe/Copenhagen时区计算机上,这打印了:
Wed Jan 31 15:57:44 CET 2018
同样,这与运行代码段前四小时的时间一致。同样, aDate中没有 UTC 偏移量。只有它的toString方法获取我 JVM 的时区设置并将其用于生成字符串,这不会影响Date. 请参阅堆栈溢出问题,如何设置 java.util.Date 的时区?,以及它的答案。
正如承诺的那样,如果您不仅需要表示时间还需要表示偏移量,请使用OffsetDateTime:
OffsetDateTime fourHoursAgoInUtc = OffsetDateTime.now(ZoneOffset.UTC).minusHours(4);
System.out.println(fourHoursAgoInUtc);
这印
2018-01-31T14:57:44.724147Z
Z最后意味着从 UTC 或“祖鲁时区”(这不是真正的时区)偏移零。到 a 的转换Date并没有比以前复杂多少,但同样,您将在转换中丢失偏移信息:
Date oldfashionedDate = Date.from(fourHoursAgoInUtc.toInstant());
System.out.println(oldfashionedDate);
这打印:
Wed Jan 31 15:57:44 CET 2018
链接: 解释如何使用的 Oracle 教程java.time
您可以使用该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.
| 归档时间: | 
 | 
| 查看次数: | 354 次 | 
| 最近记录: |