繁体   English   中英

日期和时区 java 的问题

[英]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,它没有问题。

有什么解决方法吗?

提前致谢!

它不会提前一天给你一个价值。 它会提前一个小时给你一个值(9 月 24 日午夜对 9 月 23 日晚上 11 点)。

这几乎可以肯定是时区问题,这几乎可以肯定只是您如何格式化日期的反映。 如果您使用SimpleDateFormatter ,只需适当设置TimeZone (您的实际需求将决定哪个区域),您应该得到相同的结果。

顺便说一句,一般来说,当涉及到 Java 中的日期/时间工作时,我建议尽可能使用Joda Time - 它是一个比DateCalendar更简洁的 API。

时间

正如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(旧版和现代版)和标准 SQL 中的日期时间类型表


关于java.time

java.time框架内置于 Java 8 及更高版本中。 这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar ,和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 的试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM