LocalDateTime.now() 错误的小时

Kun*_*Lun 6 java datetime

我正在使用LocalDateTime.now()获取系统的日期和时间,但时间已经过去了一个小时。

如果系统有 14:52,则now()返回 13:52。

系统操作系统为Windows 10。

Bas*_*que 5

LocalDateTime 是错误的类

永远不要LocalDateTime用来代表一个时刻,时间线上的一个特定点。故意缺乏时区或UTC偏移的任何概念,这种类型代表大约26-27小时范围内(全球时区范围)的潜在时刻。

当前时刻

要获取 UTC 中的当前时刻,请使用Instant.

Instant instant = Instant.now() ;
Run Code Online (Sandbox Code Playgroud)

要获取在特定地区(时区)的人们使用的挂钟时间中看到的当前时刻,请使用ZonedDateTime.

我怀疑您的问题是您的预期时区实际上并不是您的代码运行时的当前默认时区。在您的代码中,您未能指定时区,因此 JVM 的当前默认时区被静默应用。您可以通过调用来验证当前的默认值ZoneId.systemDefault().toString()

在我看来,隐式依赖 JVM 的当前默认时区是一种不好的做法。最好始终明确指定您想要/预期的时区。始终传递可选ZoneId参数。

ZoneId z = ZoneId.of( "America/Montreal" ) ; // Or get the JVM’s current default time zone: ZoneId.systemDefault() 
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

现在处于维护模式Joda-Time项目建议迁移到java.time类。

您可以直接与您的数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持java.timejava.sql.*

从哪里获得 java.time 类?