在Java 7中,最好的方法是同时保留具有明确时区的DateTime并将其转换为其他时区。
当我说转换时,时间(可能还有日期)将转换为时区与转换时区之间的时差。因此,从PST转换为EST,不仅将对象中的时区更改为EST,而且还将3小时添加到时间部分中,这可能导致日期延长1天。
我必须处理的是toLocalTime()和toUtcTime()。我希望能够处理任何时区的转换。
最佳答案
tl; dr
ZonedDateTime.now( // Capture the current moment as seen with a wall-clock time used by the people of a certain region (a time zone).
ZoneId.of( "America/Los_Angeles" ) // Use proper time zone names in `continent/region` format. Never use pseudo-zones such as `PST` & `EST`.
).withZoneSameInstant( // Adjust from one zone to another. Using immutable objects, so we produce a second distinct `ZonedDateTime` object.
ZoneId.of( "America/New_York" ) // Same moment, different wall-clock time.
)
java.time和ThreeTen-Backport
要获得Java 7中的许多java.time功能,请将ThreeTen-Backport库添加到您的项目中。
通常最好与UTC值一起使用。
Instant instant = Instant.now() ; // Capture the current moment in UTC.
仅在business logic要求或向用户显示时才应用时区。
您的
PST
和EST
值不是实际的时区。使用proper time zone names。ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
应用于
Instant
以获取ZonedDateTime
对象。同一时刻,时间轴上的同一点,不同的时钟时间。ZonedDateTime zdt = instant.atZone( z ) ;
调整到另一个时区。 java.time框架使用immutable objects。因此,我们不会更改(“变异”)原始文件,而是根据原始文件的值制作了一个单独的不同对象。
ZonedDateTime
对象和Instant
都表示同一时刻,时间轴上的同一点。这是在日期时间处理中要理解的关键概念。想象两个人,一个在北美的西海岸,一个在北美的东海岸,通过电话互相交谈。如果他们俩同时抬头看着挂在各自墙上的时钟,他们几点钟看到?相同的时刻,不同的时钟时间。ZoneId zNewYork = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdtNewYork = zdt.withZoneSameInstant( zNewYork ) ; // Same moment, different wall-clock time.
所有这些都已经在Stack Overflow上讨论过很多次了。因此,搜索更多示例和讨论。
关于java.time
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如
java.util.Date
,Calendar
和SimpleDateFormat
。现在位于Joda-Time中的maintenance mode项目建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换java.time对象。使用与JDBC driver或更高版本兼容的JDBC 4.2。不需要字符串,不需要
java.sql.*
类。在哪里获取java.time类?
Java SE 8,Java SE 9和更高版本
内置的
标准Java API的一部分,具有捆绑的实现。
Java 9添加了一些次要功能和修复。
Java SE 6和Java SE 7
ThreeTen-Backport中的许多java.time功能都已反向移植到Java 6和7。
Android
更高版本的Android捆绑了java.time类的实现。
对于早期的Android(ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。请参见How to use ThreeTenABP…。
ThreeTen-Extra项目使用其他类扩展了java.time。该项目是将来可能向java.time添加内容的试验场。您可能会在这里找到一些有用的类,例如
Interval
,YearWeek
,YearQuarter
和more。