时区之间的转换产生不正确的结果

gk7wooem  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(421)
DateTime dt = new LocalDateTime(rs.getTimestamp("LastUpdated").getTime()).toDateTime(DateTimeZone.forID("America/New_York")); 

Timestamp t=new Timestamp(dt.getMillis());

我从中得到的结果与“美国/纽约”的实际时间不符。几小时后下班。可能有什么问题?
更新-
这是我要转换的时间,来自db:2015-04-28 13:14:31这是转换的时间(从代码中删除“dt.plusmillis(offset)”后的代码输出:2015-04-28 22:44:31.0这是实际的纽约时间:凌晨3:45

bvn4nwqk

bvn4nwqk1#

用乔达图书馆很容易做到。核心java库是痛苦的,不建议使用它们。但是,日期和时间库已经用Java8重新实现了。
让我们举个例子,假设您尝试将澳大利亚墨尔本时间转换为马德里时间。
这是joda代码;

LocalDateTime dateTime = new LocalDateTime(2015, 3, 28, 14, 0, 0); 
    DateTime srcDateTime = dateTime.toDateTime(DateTimeZone.forID("Asia/Colombo"));
    DateTime dstDateTime = srcDateTime.withZone(DateTimeZone.forID("America/New_York"));
    Date madridTime =dstDateTime.toLocalDateTime().toDateTime().toDate();

    System.out.println("Asia/Colombo -> "+srcDateTime.toDateTime());
    System.out.println("America/New_York -> "+madridTime);

以下是输出:

Asia/Colombo -> 2015-04-28T14:00:00.050+05:30
America/New_York -> Tue Apr 28 04:30:00 EEST 2015

您也可以从http://www.timezoneconverter.com/

另请参见:
jdk 8的日期和时间api

kq4fsx7k

kq4fsx7k2#

热释光;博士

myResultSet
.getObject( … , OffsetDateTime.class )   // Returns a `OffsetDateTime` object represent a moment as seen through some offset-from-UTC, a number of hours-minutes-seconds ahead/behind UTC. 
.atZoneSameInstant(                      // Adjusts from a moment with a mere offset to a moment as seen in a time zone.
    ZoneId.of( "America/New_York" )
)

维护模式下的joda时间

仅供参考,joda time项目现在处于维护模式,建议迁移到java.time类。

localdatetime不是一个时刻

这个 LocalDateTime 类(在joda time和java.time中)并不表示一个时刻,也不是时间线上的一个点。这个类通常不用于商业应用程序,除了(a)未来的预约,和(b)表示一天中可以应用于任何地点但不适用于特定地点的时间。

避免java.sql.timestamp

显然你是一个 java.sql.Timestamp 对象来自 ResultSet . 别这样。

偏移日期时间

这个糟糕的类在几年前被java.time类所取代,特别是 OffsetDateTime 与JDBC4.2及更高版本一起使用时。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

分区日期

要在纽约地区的时区看到这一时刻,请应用 ZoneId 得到一个 ZonedDateTime 对象。

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

同样的时刻,同样的时间线上的同步点,不同的挂钟时间。
明确偏移和分区之间的区别:
从utc偏移
仅仅是几个小时分秒。正面表示领先utc(向东),反面表示落后utc(向西)。
时区
时区更重要。时区是过去、现在和未来(计划的)变化对特定地区的人们使用的补偿的历史。

关于java.time

java.time框架内置于Java8及更高版本中。这些类取代了旧的遗留日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .
要了解更多信息,请参阅oracle教程。和搜索堆栈溢出的许多例子和解释。规格为jsr 310。
现在处于维护模式的joda time项目建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用符合jdbc 4.2或更高版本的jdbc驱动程序。不需要线,不需要线 java.sql.* 班级。
从哪里获得java.time类?
JavaSE8、JavaSE9、JavaSE10、JavaSE11及更高版本—标准JavaAPI的一部分,带有捆绑实现。
Java9添加了一些次要的特性和修复。
java se 6和java se 7
大部分java.time功能都是通过三个十个后端口后端口移植到Java6和Java7的。
安卓
android包java.time类的更高版本实现。
对于早期的android(<26),threetenabp项目采用了threeten backport(如上所述)。了解如何使用threetenabp…。
threeten额外的项目用额外的类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,等等。

相关问题