Вставка в базу данных даты-времени с текущим временем UTC - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь вставить datetime в базу данных mysql для текущего времени UTC через функцию GETUTCDATE () в sql. Это терпит неудачу с "ФУНКЦИОНАЛЬНЫМ GETUTCDATE НЕ СУЩЕСТВУЕТ".

Можно ли получить текущее время UTC в формате sql datetime из Java и просто вставить его в виде строки?

Еще одна большая проблема, с которой я столкнулся, заключается в том, что мне нужно преобразовать вышеуказанный объект datec utc в локальные часовые пояса, и я не знаю, как это сделать с помощью стандартных Java-API.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

tl; dr

myPreparedStatement      // Using a `PreparedStatement` avoids SQL-injection security risk.
.setObject(              // As of JDBC 4.2, we can exchange java.time objects with a database via `getObject`/`setObject` methods.
    … ,                  // Indicate which `?` placeholder in your SQL statement.
    OffsetDateTime.now( ZoneOffset.UTC )  // Capture the current moment in UTC.
) ;

java.time

Современное решение использует классы java.time , которые годы назад вытеснили ужасные старые классы даты и времени..

Получить текущий момент в UTC, используя OffsetDateTime.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;

В MySQL 8.0 используется разрешение микросекунд для шести десятичных знаковместа в доли секунды.Классы java.time имеют более точное разрешение наносекунд .Таким образом, вы можете обрезать любые существующие нанос из вашего OffsetDateTime.Укажите желаемое разрешение с помощью ChronoUnit.

OffsetDateTime odt = 
    OffsetDateTime
    .now( 
        ZoneOffset.UTC 
    ) 
    .truncatedTo( ChronoUnit.MICROS ) 
;

Отправьте в свою базу данных через PreparedStatement на столбец типа, похожего на SQL-стандартный TIMESTAMP WITH TIME ZONE тип данных.Для MySQL 8.0 это будет тип TIMESTAMP.

myPreparedStatement.setObject( … , odt ) ;

И поиск через ResultSet.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

Чтобы увидеть этот момент через объектив настенного времени, используемого людьми определенного региона (времязона), примените ZoneId, чтобы получить ZonedDateTime объект.

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;  // Same moment, same point on the timeline, different wall-clock time. 

О java.time

Среда java.time встроена в Java 8и позже.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации связки Android java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

0 голосов
/ 16 ноября 2018

Вы можете сделать это следующим образом:

OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);
String sql_date = utc.format(DateTimeFormatter.ofPattern("MM/dd/yyyy")); //here, you can change the format of SQL date as you need

Вам нужно будет импортировать классы следующим образом:

import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

Надеюсь, это поможет.

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