У меня очень странное поведение при сохранении дат в базе данных. На моем (Linux centOS 6.2) сервере я использую сервер приложений Glassfish (3.1.1 - build 12) и Java (1.7.0_09), приложение разработано в Java + GWT и использует сервер PostgreSQL (9.2.1). Внутри приложения есть несколько полей даты, которые сохраняются на db. В полях даты используется datepicker (http://code.google.com/p/gwt-datepicker, r30).
Атрибут date отношения db - это тип даты (не временная метка). Некоторые даты сохраняются за день до этого в базе данных. Проблема возникает только для дат между интервалами, например. между 31.03.1968 и 27.10.1968, что заставляет меня думать о какой-то проблеме летнего времени. Но, поскольку это не происходит в 1969 году, например, я не могу изолировать проблему очень хорошо. Я пытаюсь найти другой интервал дат, внутри которого возникает проблема. Например, если я выбираю 19.05.1968 в приложении, после сохранения в базе данных дата сохраняется как 18.05.1968.
Странно, что у меня есть другое значение одного и того же приложения на другом сервере, и для тех же дат они сохраняются правильно. Это заставляет меня думать, что проблема может положиться либо на:
- конфигурация стеклянной рыбы;
- java (реализация java.util.Date?);
- какая-то конфигурация сервера отсутствует
Я попытался установить в Европу/Рим (мой часовой пояс) каждую конфигурацию моего сервера, но ничего. Есть идеи? Как я мог решить или исследовать эту проблему?
UPDATE: 1968 год был високосным. Проблема также возникает в 1972 году, которая снова високосный год. Подведение итогов: Проблема "с датой с сохранением одного дня раньше" происходит в високосные годы в течение интервала даты летнего времени.
Кодовая часть, в которой создается проект даты:
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);