Как сохранить дату и время в UTC в SQL Server datetimeoffset с JDBC - PullRequest
0 голосов
/ 05 июня 2018

Моему приложению Spring Boot требуется хранить и выражать все даты и время в формате UTC, поэтому POJO в приложении используют тип данных OffsetDateTime, а база данных SQL Server 2016 использует тип столбца datetimeoffset(7).Библиотека JDBC ms-sql 6.1.0.0, драйвер, совместимый с JDBC 4.2.Версия JVM - Oracle Java 8.

Я использую Spring JDBC и NamedParameterJdbcTemplate для реализации класса реализации DAO. Нет JPA, ORM и т. Д.

При вставке записи я использую jdbcTemplate.update(String, Map<String,Object>).Похоже, что это работает, за исключением , что значения, сохраненные в базе данных, не совпадают с теми, которые я указал на карте.Например, namedParameters.put("record_datetime", someEntity.getRecordDatetime());, где свойство recordDatetime этого объекта содержит значение 2018-05-31T13:20:01Z, сохраняется в базе данных как 2018-05-31T20:20:01.0000000+00:00.Я нахожусь в часовом поясе GMT-7, но свойство использует тип данных OffsetDataTime без смещения, то есть, по сути, это GMT.

У меня есть большая проблема под рукой, когда я пытаюсь получить значениеиз базы данных.Я использую jdbcTemplate.queryForObject(String, Map<String,?>, RowMapper<T>), а в RowMapper я использую resultSet.getObject("record_datetime", OffsetDateTime.class).Это приводит к исключению:

java.sql.SQLFeatureNotSupportedException: This operation is not supported.

Я пытался использовать OffsetDateTime.ofInstant(resultSet.getObject("record_datetime", Instant.class), ZoneId.of("UTC")).Выдается то же исключение, что и выше.

Это должно быть очень распространенным требованием, чтобы иметь возможность хранить значения в UTC и / или со значениями смещения.В других приложениях я использовал java.util.Date и либо java.sql.Date (или java.sql.Timestamp) в DAO для сохранения значений даты или даты и времени, и это в целом работало хорошо.Мне как-то сложно это реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...