- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
您能否阐明如何为默认系统时区和给定时区获取以毫秒为单位的正确纪元时间。
1.时区:GMT+3
2。以下代码片段:
import java.time.*;
public class Main {
public static void main(String[] args) {
System.out.println(LocalDateTime
.now()
.atZone(ZoneOffset.UTC)
.toInstant()
.toEpochMilli()
);
System.out.println(LocalDateTime
.now()
.atZone(ZoneOffset.of("+3"))
.toInstant()
.toEpochMilli()
);
System.out.println(System.currentTimeMillis());
}
}
3。输出:
1444158955508
1444148155508
1444148155508
4. System.currentTimeMillis() 的 JavaDoc表明返回值将是当前时间与 1970 年 1 月 1 日午夜 UTC 之间的差值,以毫秒为单位。
LocalDateTime
在 GMT+3
的输出与 System.currentTimeMillis()
相同,尽管 的文档code>System.currentTimeMillis()
提到 UTC
?LocalDateTime
在 UTC
的输出不同于 System.currentTimeMillis()
,尽管 System.currentTimeMillis 的文档()
提到 UTC
?最佳答案
System.currentTimeMillis()
和 Instant.toEpochMilli()
都返回自 Unix 纪元以来的毫秒数。这不是“在”任何特定时区,尽管 Unix 纪元通常表示为“1970 年 1 月 1 日午夜,UTC”。但瞬间只是时间上的瞬间,无论您身处哪个时区,它都是一样的 - 但它会反射(reflect)不同的本地时间。
LocalDateTime.atZone(UTC)
的输出不同,因为您说的是“采用本地日期和时间,并将其转换为即时,就好像它是 UTC 时间一样zone” - 即使当您创建 LocalDateTime
时,您在 UTC+3 时区中隐含地这样做了……这就是为什么它是“错误的”。
LocalDateTime.now()
采用系统默认时区中的本地日期和时间。所以如果你的时区是UTC+3,当前时间是2015-10-06T16:57:00Z,那么LocalDateTime.now()
会返回.2015-10-06T19 :57:00
。我们称它为 localNow
...
所以 localNow.atZone(ZoneOffset.of("+3"))
将返回一个 ZonedDateTime
代表 2015-10-06T19:57:00+03 - 在换句话说,相同的本地日期/时间,但“知道”它比 UTC 早 3 小时...所以 toInstant()
将返回代表 2015-10 的 Instant
-06T16:57:00Z。太好了 - 我们还有当前的日期/时间。
但是 localNow.atZone(ZoneOffset.UTC)
将返回代表 2015-10-06T19:57:00Z 的 ZonedDateTime
- 换句话说,相同的本地日期/时间,但“认为”它已经在 UTC 中了……所以 toInstant()
将返回代表 2015-10-06T19:57:00Z 的 Instant
.. 这是根本不是当前时间(三小时后)。
关于java - JSR 310::System.currentTimeMillis() 与 Instant.toEpochMilli()::TimeZone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32975392/
我必须生成一个可读的唯一 ID,因此不能使用 UUID。所以我想到了使用Instant.toEpochMilli()。可以用作唯一ID吗? 最佳答案 不。我个人遇到过这样的情况,即两个对象具有相同的
调用 JDK Instant.toEpochMilli() 可能会导致算术上溢/下溢(例如 Instant.MAX.toEpochMilli() 或 Instant.MIN。 toEpochMilli
我正在开发 toEpochMilli() 的字符串转换方法。但是当我在不同时区的区域服务器上发布代码时,我得到了不同的结果。怎么解决? //input = "2019-12-26T00:00:
在Java中,我们可以有多种不同的方法来获取当前时间戳,但推荐使用以下一种:Instant.now().toEpochMilli() 或 System.currentTimeMillis() 最佳答案
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我想使用可以在 ZonedDateTime 和 Instant.toEpochMilli() 之间转换的 MIN/MAX 时间值,用作过滤器/查询的标记值。 我试过: OffsetDateTime.M
您能否阐明如何为默认系统时区和给定时区获取以毫秒为单位的正确纪元时间。 给定 1.时区:GMT+3 2。以下代码片段: import java.time.*; public class Main {
我是一名优秀的程序员,十分优秀!