データベースに日付を保存しているときに、非常に奇妙な動作が発生します。私の(Linux centOS 6.2)サーバーでは、glassfishアプリケーションサーバー(3.1.1-ビルド12)とJava(1.7.0_09)を使用し、アプリケーションはJava + GWTで開発され、PostgreSQLサーバー(9.2.1)を使用します。アプリケーション内には、データベースに保存されるいくつかの日付フィールドがあります。日付フィールドはdatepicker(http://code.google.com/p/gwt-datepicker、r30)を使用します。
dbリレーションのdate属性は、日付タイプ(タイムスタンプではありません)です。一部の日付は前日にデータベースに保存されます。この問題は、間隔の間の日付、たとえば31.03.1968と27.10.1968の間でのみ発生します。これにより、ある種の夏時間の問題が考えられます。しかし、たとえば1969年には発生しないため、問題をうまく切り分けることができません。問題が発生する他の日付間隔を見つけようとしています。たとえば、アプリケーションで19.05.1968を選択した場合、データベースに保存した後、日付は18.05.1968として保存されます。
奇妙なことに、同じアプリケーションの別のインスタンスが別のサーバーにあり、同じ日付で正しく保存されます。これにより、問題は次のいずれかに依存する可能性があると思います。
- Glassfishの構成;
- java(java.util.Date実装?);
- 私が欠けているある種のサーバー構成
サーバーで可能なすべての構成をヨーロッパ/ローマ(私のタイムゾーン)に設定しようとしましたが、何もしませんでした。何か案が?この問題をどのように解決または調査できますか?
更新: 1968年はうるう年でした。この問題は1972年にも発生しますが、これもうるう年です。要約:「1日前に保存された日付」の問題は、夏の時間の日付間隔のうるう年に発生します。
日付オブジェクトが作成されるコード部分は次のとおりです。
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);