Проблема создания метки времени (несколько) во время летнего времени

1

Я борюсь с проблемой. Чем больше я исследую и отлаживаю его, тем больше я думаю, что я не могу полностью его понять.

Мой часовой пояс - ET (UTC -5). Час находится где-то между 21:00 и 21:59. Дата - 8 марта 2014. В этот часовой пояс DST происходит 9 марта 2014 года, когда 1:59:59 становится 3:00:00.

Я хочу сохранить текущее время даты как временную Timestamp в БД с Hibernate. Для этого я использую класс Jadira PersistentDateTime. Я сохраняю значения UTC, поэтому Jadira меняет текущее время (например, 8 марта 2014 21:30 по восточному времени) до 9 марта 2014 года 02:30 UTC, что верно. Затем он создает Timestamp из строкового представления времени даты UTC и Timestamp является 09-MAR-14 03.30.00.000000000 AM. Когда я возвращаюсь к представлению ET, я получаю 8 марта 2014 года 22:30 ET.

Насколько я понимаю, это неправильно - я должен получить то же самое время.

Мне кажется, что при создании Timestamp применяется DST, хотя этого не должно быть. Я рассматриваю одну деталь: ET - UTC -5. 21:00 - это именно тот час, когда DST происходит в ET минус 5 часов. Итак, 21:30 ET - 2:30 UTC. 2:30 является недействительным нашим в ET, 8 марта. Возможно, это связано с странным поведением.

Я использую jadira 1.9 (usertype.joda-time-1.9.jar и usertype.spi-1.9.jar) и Hibernate 3.6.0. Моя модель:

@Entity
@Table(name = RUN_STATUS_DATA_DB_TABLE_NAME)
@Access(AccessType.PROPERTY)
public class StatusData implements Identifiable, Serializable {

    ...

    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    @Column(name = RUN_STATUS_COLUMN_POST_EXECUTION_END_TIME)
    public DateTime getPostExecutionEndTime() {
        return postExecutionEndTime;
    }

    public void setPostExecutionEndTime(DateTime postExecutionEndTime) {
        this.postExecutionEndTime = postExecutionEndTime;
    }
}

Код Jadira, создающий неожиданную временную метку, относится к этому классу, в строке 72

Любая мысль о том, почему это происходит? благодаря

Теги:
datetime
timezone
dst
jodatime

1 ответ

0

После версии Usertype, которую вы используете, было много улучшений и исправлений.

Я предоставил максимально возможную функциональность для Hibernate 3.6 и Java 5. Вы можете использовать этот backport с помощью модуля usertype.core-hibernate36.

В настоящее время вам нужно будет построить это от источника до следующей версии. Получить источники из https://github.com/JadiraOrg/jadira

Кроме того, ознакомьтесь с документацией по адресу http://jadira.sourceforge.net/usertype-userguide.html.

Дайте мне знать, если вы столкнулись с какими-либо проблемами.

Отказ от ответственности: Я поддерживаю Джадиру.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню