时区之间的java转换给出了不正确的结果
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
# 1 楼答案
使用JODA library很容易做到这一点。核心java库非常痛苦,不建议使用它们。然而,日期和时间库已经用Java8重新实现
让我们举个例子,假设您尝试将澳大利亚墨尔本时间转换为马德里时间
这是Joda代码
以下是输出:
您也可以从http://www.timezoneconverter.com/进行检查
另请参见:
Date and Time API for JDK 8
# 2 楼答案
tl;博士
维护模式下的Joda时间
仅供参考,Joda-Time项目现在位于maintenance mode,建议迁移到java.time类
LocalDateTime
不是一个时刻LocalDateTime
类(在Joda Time和java.Time中)不代表一个时刻,而不是时间线上的一个点。该类通常不用于商业应用程序,除了(a)未来的预约,以及(b)表示可以应用于任何地点但不适用于特定地点的日期和时间避免
java.sql.Timestamp
显然,您是从
ResultSet
检索到一个java.sql.Timestamp
对象的。停止这样做OffsetDateTime
这个糟糕的类在几年前被java所取代。时间类,特别是与JDBC4.2及更高版本一起使用时的^{}
ZonedDateTime
要查看此moment in the New York区域的时区,请应用^{} 获取^{} 对象
相同的时刻,时间线上相同的同时点,不同的挂钟时间
清楚偏移和分区之间的区别:
仅仅是小时分秒数。正面表示领先UTC(向东),负面表示落后UTC(向西)李>
一个时区是更多的时区。时区是过去、现在和未来(计划)对特定地区的人们使用的偏移量的变化的历史李>
关于java。时间
java.time框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如^{} 、^{} 、&^{}
要了解更多信息,请参阅Oracle Tutorial。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310
现在位于maintenance mode的Joda-Time项目建议迁移到java.time类
您可以交换java。时间对象直接与数据库连接。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要
java.sql.*
类在哪里可以获得java。时间课
ThreeTen-Extra项目扩展了java。额外上课的时间。这个项目是将来可能添加到java的一个试验场。时间您可以在这里找到一些有用的类,例如^{} 、^{} 、^{} 和more