Переход на летнее время в метке времени без часового пояса - PullRequest
0 голосов
/ 16 апреля 2019

Я использую hibernate для связи с базой данных postgresql для хранения данных для моделирования.В этих моделях существуют временные ряды, основанные на временных отметках без часового пояса.Теперь при загрузке меток времени, которые были созданы правильно (в данном случае для 2030 года), метка времени для 2030-03-31T02: 00 заканчивается как 2030-03-31T-03: 00 в базе данных в столбце, который являетсяметка времени без часового пояса.Я уже изменил конфигурацию базы данных, чтобы ее часовой пояс был UTC, но проблема остается.

Проблема, похоже, находится либо в драйвере (https://mvnrepository.com/artifact/org.postgresql/postgresql/42.2.5), либо в базе данных. При вставке метки времени в виде строки это работает. Также эта проблема возникает на локальной и удаленной БД.

Кроме того, hibernate находится в версии 5.4.2 (новейшей) и в моем файле persistence.xml я установил флаг:

<property name="hibernate.jdbc.time_zone" value="UTC"/>

Небольшой тест, который я написал, выглядит так:

@Test
   public void testTimeShift() {

       EntityManager em = JPAUtil.createEntityManager();


       TimeStep timeStep = new TimeStep();
       LocalDateTime.now(Clock.systemUTC());
       LocalDateTime ldt = LocalDateTime.parse("2030-03-31T02:00:00");
       timeStep.setTimeStamp(ldt);

       SaveToDB.(timeStep, em);

       em.close();

       EntityManager em2 = JPAUtil.createEntityManager();

       TimeStep timeStep2 = LoadFromDB.getTimeStep(ldt, em2);

       if (timeStep.getTimeStamp() != timeStep2.getTimeStamp()) {
           System.out.println(timeStep.getTimeStamp());
           System.out.println(timeStep2.getTimeStamp());
           throw new EmptyStackException();
       }
   }

Этот код возвращает следующее:

2030-03-31T02:00
2030-03-31T03:00

Process finished with exit code -1

1 Ответ

0 голосов
/ 18 апреля 2019

Ответ заключается в том, чтобы установить тип метки времени в ZonedTimeData. Это может быть проанализировано с и на LocalDateTime для удобства. Таким образом, тест работает.

Итак, в отличие от того, что рекомендуется, для временного шага без использования часового пояса:

@Entity
@Table(name = "`TimeStep`")
public class TimeStep {

   @Column(name = "`TimeStamp`")
   private ZonedDateTime TimeStamp;
}

Создание временных шагов выполняется через

LocalDateTime.now(Clock.systemUTC());
LocalDateTime ldt = LocalDateTime.parse("2030-03-31T02:00:00");

ZonedDateTime zonedDateTime = ZonedDateTime.of(ldt, ZoneId.of("UTC"));
timeStep.setTimeStamp(zonedDateTime);
...