【发布时间】:2012-10-27 08:11:15
【问题描述】:
我在数据库中保存日期时遇到了一种非常奇怪的行为。在我的(Linux centOS 6.2)服务器上,我使用 glassfish 应用程序服务器(3.1.1 - build 12)和 Java(1.7.0_09),该应用程序是用 Java + GWT 开发的,它使用 PostgreSQL 服务器(9.2.1)。在应用程序内部,有几个日期字段保存在数据库中。日期字段使用 datepicker (http://code.google.com/p/gwt-datepicker, r30)。
db 关系的日期属性是日期类型(不是时间戳)。一些日期前一天保存在数据库中。该问题仅发生在间隔之间的日期,例如在 31.03.1968 和 27.10.1968 之间,这让我想到了某种夏令时问题。但由于它不会发生在 1969 年,例如,我不能很好地隔离问题。我试图找到问题发生的其他日期间隔。 例如,如果我在应用程序中选择 19.05.1968,则保存到数据库后,日期将保存为 18.05.1968。
奇怪的是,我在另一台服务器上有同一个应用程序的另一个实例,并且在相同的日期它们被正确保存。 这让我认为问题可能取决于:
- glassfish 配置;
- java(java.util.Date 实现?);
- 我缺少某种服务器配置
我尝试将我的服务器的所有可能配置都设置为欧洲/罗马(我的时区),但没有。任何想法?我该如何解决或调查这个问题?
更新: 1968年是闰年。这个问题也发生在 1972 年,又是闰年。总结:“date-saved-one-day-before”问题发生在闰年的夏令时日期间隔中。
创建日期对象的代码部分是:
Date d = dateField.getSelectedDate();
if (d != null) {
txtVal = DateTimeFormat.getFormat("dd/MM/yyyy").format(d);
}
其中 dateField 声明为:
transient private DatePicker dateField;
包是org.zenika.widget.client.datePicker.DatePicker(前面提到过gwt-datepicker-r30),DateTimeFormat指的是com.google.gwt.i18n.shared.DateTimeFormat
接受答案后更新:
我使用了这个解决方法:创建日期时,我使用以下代码:
final long hours12 = 12L * 60L * 60L * 1000L;
Date d = new Date(d1.getTime() + hours12);
【问题讨论】:
-
你在用什么jre r?如果是 1.4 或更早版本,那么您可能会遇到问题
-
java 版本“1.7.0_09”Java(TM) SE 运行时环境(内部版本 1.7.0_09-b05)Java HotSpot(TM) 64 位服务器 VM(内部版本 23.5-b02,混合模式)
-
@lorenzo.marcon 也许昨天对你来说基本上是太长的一天;)。但无论如何,这是一个有趣的问题,如果您找到解决方案,请告诉我们。
-
我从问题中删除了更新,因为我错了,即使今天早上我仍然遇到问题.. :/
-
你有代码来操作日期吗?如果是这样,你可以发布它吗? (我见过许多日期计算在夏令时更改发生时会中断。)
标签: java postgresql gwt date glassfish