添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

LocalDateTime.now()并没有给出系统的本地时间。

0 人关注

我有一个问题, LocalDateTime.now() 返回错误的时间(偏离2小时,与时区相同)。

当我检查linux服务器时, date 命令返回正确的时间,运行 hwclock -r 也显示正确的时间。

这是来自命令 timedatectl https://gyazo.com/9c70f5719a03492e0d7fdff3128f2f1d

本地时间是 date hwclock -r 中显示的时间,但 LocalDateTime.now() 返回的是世界时间/RTC时间。

即使是MySQL也会显示当地时间(做 SELECT NOW() )。

我知道我可以使用 ZonedTimeZone ,但这不仅适用于我自己的项目,而且也适用于在我无法控制的机器上运行的其他java程序/插件,我想知道为什么/要改变什么来使 LocalDateTime.now() 返回正确的时间。

5 个评论
如果你知道你在做什么,你可以一直使用 LocalDateTime.now(yourDesiredTimeZoneId) 。例如 LocalDateTime.now(ZoneId.of("Europe/Copenhagen"))
是的,我知道我也可以这样做,但还是要谢谢你!对于那些使用LocalDateTime.now()的非我自己的程序/插件,问题仍然存在。
也许JVM的默认时区被设置为UTC。这就发生了。要检查,请尝试 System.out.println(ZoneId.systemDefault());
问题是,一个插件--同一插件或不同的插件--可能会设置JVM的默认时区。如果这就是问题所在,我无法告诉你解决方案。除了我已经说过的,不要依赖它之外。这始终是一个好的和健全的想法。
@OleV.V. 如果我只是建立一个独立的jar,只包含LocalDateTime.now()的打印,也会发生这种情况(像这样 gyazo.com/4d76e2614be8b17f8a08e77c610569ee ) 所以我不怀疑是另一个插件,还是我错了?
java
linux
time
Sumsar1812
Sumsar1812
发布于 2022-08-16
2 个回答
Basil Bourque
Basil Bourque
发布于 2022-08-16
已采纳
0 人赞同

Wrong class

我无法想象在什么情况下拨打 LocalDateTime.now() 是正确的做法。

替换代码1】类不能代表一个时刻,一个时间线上的特定点,因为它缺乏一个时区或与UTC的偏移的背景。

当你调用 LocalDateTime.now 方法时,JVM的当前默认时区被隐含地应用。但请记住,当前的默认值可以在运行时,在任何时候,由该JVM中的任何应用程序的任何代码改变。

简单地说,你使用的是错误的类。

ZonedDateTime

要捕捉在某一特定时区看到的当前时刻,请使用 ZonedDateTime 类。

ZoneId z = ZoneId.of( "Europe/Paris" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;