没有时区
正如其他正确答案所述,java.util.Date没有时区† 。 它代表UTC / GMT(没有时区偏移量)。 非常混乱,因为它的toString方法在生成String表示时应用JVM的默认时区。
避免juDate
由于这个和其他许多原因,你应该避免使用内置的java.util.Date&.Calendar&java.text.SimpleDateFormat。 他们是非常麻烦的。
而是使用Java 8捆绑的java.time包 。 这些新课程受JSR 310定义的Joda-Time的启发,并由ThreeTen-Extra项目扩展。 对于Java 6和7,请使用后端项目ThreeTen-Backport 。 对于Android,这个后端端口ThreeTenABP的改写 。 请参阅Oracle教程 。
java.time
java.time类可以用三种方式在时间线上表示一个片刻:
UTC( Instant )
用偏移量( OffsetDateTime与ZoneOffset )
随着时区( ZonedDateTime与ZoneId )
Instant
在java.time中 ,基本构建块是“ Instant ,即UTC中的时间线。 使用Instant对象的大部分业务逻辑。
Instant instant = Instant.now();
OffsetDateTime
应用UTC的偏移量来调整某些地点的挂钟时间 。
应用ZoneOffset获得OffsetDateTime 。
ZoneOffset zoneOffset = ZoneOffset.of( "-04:00" ); OffsetDateTime odt = O