Java - дата сохранена как накануне
Я испытываю очень странное поведение при сохранении дат в базе данных. На моем (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 является тип даты (не отметка времени). Некоторые даты сохраняются за день до этого в базе данных. Проблема возникает только для дат между интервалами, например, между 31.03.1968 и 27.10.1968, что заставляет меня задуматься о летнем времени. Но так как это неНапример, в 1969 году я не могу выделить проблему очень хорошо. Я'Я пытаюсь найти какой-то другой интервал дат, в течение которого возникает проблема.Например, если я выберу 19.05.1968 в приложении, после сохранения в базе данных дата будет сохранена как 18.05.1968.
Странно то, что у меня есть другой экземпляр того же приложения на другом сервере, и на те же даты они сохраняются правильно. Это заставляет меня думать, что проблема может зависеть от:
конфигурация стеклянной рыбы;java (реализация java.util.Date?);какая-то конфигурация сервера I 'м отсутствуетЯ пытался установить для Европы / Рима (мой часовой пояс) каждую возможную конфигурацию моего сервера, но ничего. Любая идея? Как я мог решить или исследовать эту проблему?
ОБНОВИТЬ: 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);