[英]Issue with Date and TimeZone java
我有一个关于显示日期的非常奇怪的问题。 特别是在窗户中。 我不知道为什么,当我从查询(休眠)中获得日期时,它让我少了一天。 当数据到达服务器时,日期很好,但是当它到达客户端时,它会减少一天。 例如:在服务器中的日期是Fri Sep 24 00:00:00 1982但当它到达客户端时是Thu Sep 23 23:00:00 1982 。 正如你所看到的,这是一个不同的日子。
啊,我几乎忘记提到它发生在 Windows (Seven) 上,因为它的时区是它的 UTC 而不是 GMT。 我和我的同事使用 Linux,它没有问题。
有什么解决方法吗?
提前致谢!
正如Jon Skeet 正确指出的那样,您可能有时区问题。 可能您的中间件工具正在动态应用默认时区,这是一个善意但非常令人困惑的反功能。
现代解决方案是使用添加到 Java 8 及更高版本的java.time类。
从 JDBC 4.2 开始,我们可以与数据库交换java.time对象。 Hibernate 和 JPA 也已更新以处理java.time 。
从类似于TIMESTAMP WITH TIME ZONE
类型的列中检索。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
写作。
myPreparedStatement.setObject( … , odt ) ;
通过使用这些对象,您将避免您的中间件工具应用时区。 使用 JDBC 4.2 检索java.time对象,您将看到真正存储的值。
java.time框架内置于 Java 8 及更高版本中。 这些类取代麻烦的老传统日期时间类,如java.util.Date
, Calendar
,和SimpleDateFormat
。
要了解更多信息,请参阅Oracle 教程。 并在 Stack Overflow 上搜索许多示例和解释。 规范是JSR 310 。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
您可以直接与您的数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC 驱动程序。 不需要字符串,不需要java.sql.*
类。
从哪里获得 java.time 类?
ThreeTen-Extra项目用额外的类扩展了 java.time。 该项目是未来可能添加到 java.time 的试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.