Java - 日期保存为前一天

Lor*_*con 19 java postgresql gwt date glassfish

我在数据库上保存日期时遇到了一种非常奇怪的行为.在我的(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关系的date属性是日期类型(不是时间戳).有些日期在前一天保存在数据库中.问题只发生在间隔之间的日期,例如在19.03.1968和1910年10月27日之间,这让我想到了某种夏季时间问题.但是,由于1969年没有发生这种情况,我无法很好地孤立这个问题.我正在尝试找到问题发生的其他日期间隔.例如,如果我在应用程序中选择19.05.1968,则在保存到数据库中后,日期将保存为18.05.1968.

奇怪的是,我在另一台服务器上有相同应用程序的另一个等级,并且在相同日期它们被正确保存.这让我觉得问题可能依赖于:

  • 玻璃鱼配置;
  • java(java.util.Date implementation?);
  • 我缺少某种服务器配置

我尝试将服务器的每个配置设置为欧洲/罗马(我的时区),但没有.任何的想法?我怎么能解决或调查这个问题?

更新: 1968年是闰年.这个问题也发生在1972年,这也是闰年.总结:在夏季时间间隔期间,闰年发生了"日期保存一天前"问题.

创建日期对象的代码部分是:

Date d = dateField.getSelectedDate();
if (d != null) {
    txtVal = DateTimeFormat.getFormat("dd/MM/yyyy").format(d);
}
Run Code Online (Sandbox Code Playgroud)

其中dateField声明为:

transient private DatePicker dateField;
Run Code Online (Sandbox Code Playgroud)

包是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);
Run Code Online (Sandbox Code Playgroud)

Mik*_*keN 7

只需将日期的时间设置为12:00(而不是默认的0:00),您应该没问题.问题是GWT时区库不包括1990年之前的所有闰年,因此您将在服务器上得到错误的时间(因为该值以时间戳的形式发送并且是一小时关闭).

顺便说一句:GWT有一个内置的日期选择器,请参阅http://gwt.google.com/samples/Showcase/Showcase.html#!CwDatePicker上的演示