在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要求或向用户显示时才应用时区。

您的PSTEST值不是实际的时区。使用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.DateCalendarSimpleDateFormat

现在位于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 8Java SE 9和更高版本


内置的
标准Java API的一部分,具有捆绑的实现。
Java 9添加了一些次要功能和修复。

Java SE 6Java 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添加内容的试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

09-10 14:11
查看更多