Добавить дату и время UTC в базу данных в Java - PullRequest
1 голос
/ 21 мая 2019

Я хочу добавить дату и время UTC в мою базу данных mysql в качестве метки времени. Ранее я пытался использовать SimpleDateFormat как:

        //UTC based issued date and expiry date
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        final String currentUtc= sdf.format(new Date());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date currentDate = (Date) simpleDateFormat.parse(currentUtc); //java.util.date

Это сработало, но я обнаружил, что использование SimpleDateFormat не рекомендуется. Так что теперь я использую api Instant date time как:

 Instant currentInstant = Instant.now().truncatedTo(ChronoUnit.SECONDS); //gives UTC datetime

, который правильно показывает мне текущее время в UTC. Проблема заключается в том, что когда я добавляю этот момент в свою базу данных, он конвертируется в локальную дату, добавляя смещение времени UTC к тому моменту, который мне не нужен.

    //adding UTC time to database but not working
    ps.setTimestamp(1, Timestamp.from(currentInstant)); 

Итак, как добавить дату UTC без добавления смещения времени UTC в моей базе данных? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

JDBC 4.2

    ps.setObject(1, currentInstant.atOffset(ZoneOffset.UTC));

Начиная с JDBC 4.2 мы можем напрямую передавать объекты java.time в объекты JDBC, такие как PreparedStatement и ResultSet.Возможно, удивительно, что мы больше не должны использовать setTimestamp или подобные специфические методы, а просто setObject и getObject.Таким образом, им удалось добавить новые функциональные возможности без изменения спецификации API (методы setObject и getObject уже были там).

Некоторые драйверы JDBC принимают только ps.setObject(1, currentInstant);, что логично.Я не помню, работает ли Connector / J для MySQL.В любом случае, это не указано в стандарте JDBC, который требует OffsetDateTime, а не Instant.Так что я бы использовал более длинную форму выше, которая преобразуется в OffsetDateTime, если только для переносимости.

И поздравляю с опущенными SimpleDateFormat, Date и Timestamp позади.У них было время, но все они были плохо спроектированы, поэтому я согласен не использовать их.

0 голосов
/ 24 мая 2019

Вы делаете правильно.Это произошло потому, что база данных Mysql автоматически конвертирует UTC DateTime в системный часовой пояс.Если вы действительно хотите использовать UTC DateTime, тогда вы можете установить часовой пояс вашей базы данных MySQL как

SET TIME_ZONE='+00:00';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...