Java - data zapisana jak poprzedniego dnia
Doświadczam bardzo dziwnego zachowania podczas zapisywania dat w bazie danych. Na moim serwerze (Linux centOS 6.2) używam serwera aplikacji glassfish (3.1.1 - kompilacja 12) i Java (1.7.0_09), aplikacja jest rozwijana w Javie + GWT i używa serwera PostgreSQL (9.2.1). Wewnątrz aplikacji znajduje się kilka pól daty zapisanych w db. Pola daty używają datepicker (http://code.google.com/p/gwt-datepicker, r30).
Atrybut daty relacji db to typ daty (nie znacznik czasu). Niektóre daty są zapisywane dzień wcześniej w bazie danych. Problem występuje tylko dla dat między przedziałami, np. między 31.03.1968 a 27.10.1968, co sprawia, że myślę o problemie z czasem letnim. Ale ponieważ na przykład nie zdarza się to w 1969 r., Nie mogę dobrze wyizolować problemu. Próbuję znaleźć jakiś inny przedział czasu, w którym problem występuje.Na przykład, jeśli wybiorę 19.05.1968 w aplikacji, po zapisaniu w bazie danych data zostanie zapisana jako 18.05.1968.
Dziwne jest to, że mam inną istotę tej samej aplikacji na innym serwerze i dla tych samych dat są one poprawnie zapisywane. To sprawia, że myślę, że problem może polegać albo na:
konfiguracja szklistka;java (implementacja java.util.Date?);brakuje mi konfiguracji serweraPróbowałem ustawić w Europie / Rzymie (moja strefa czasowa) każdą możliwą konfigurację mojego serwera, ale nic. Dowolny pomysł? Jak mogę rozwiązać lub zbadać ten problem?
AKTUALIZACJA: Rok 1968 był rokiem przestępnym. Problem występuje również w 1972 r., Który jest ponownie rokiem przestępnym. Zreasumowanie:problem „data uratowana-jeden dzień przed” pojawia się w latach przestępnych w okresie letnim.
Część kodu, w której tworzona jest data oject:
Date d = dateField.getSelectedDate();
if (d != null) {
txtVal = DateTimeFormat.getFormat("dd/MM/yyyy").format(d);
}
gdzie dateField jest zadeklarowane jako:
transient private DatePicker dateField;
Pakiet jestorg.zenika.widget.client.datePicker.DatePicker
(wspomniany wcześniej gwt-datepicker-r30), a DateTimeFormat odnosi się docom.google.gwt.i18n.shared.DateTimeFormat
AKTUALIZUJ po zaakceptowaniu odpowiedzi:
Użyłem tego obejścia: kiedy tworzę datę, używam następującego kodu:
final long hours12 = 12L * 60L * 60L * 1000L;
Date d = new Date(d1.getTime() + hours12);