是否有可能在一小时前或一天前创建一个保证为UTC且在过去特定时间的System.currentTimeMillis()
对象,这是一个好主意吗?
我查看了Stack Overflow问题
"Learning Linux Binary Analysis" by Ryan "elfmaster" O'Neill及其答案。但我希望避免添加更多依赖项,例如TextBlock2
,并且接受的答案使用TextBlock2
这将是本地时区,不是吗?
答案 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