Установите MySql часовой пояс динамически с JVM -Duser.timezone в Spring Boot - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть сервер Ubuntu 16 в TZ "IST".
MySQL (v5.7) в TZ "IST".
Spring-boot (v2), Java (v1. 8) Баночка в "Америке / Лос-Анджелесе", ТЗ. Установка из -Duser.timezone arg.

Проблема: Поскольку мой Java Дата объекта находится в TZ "America / Los_Angeles", выборка данных MySQL не работала, так как MySQL дата была на день позже java date.
Нашли вышеуказанное различие в Java при регистрации фактической даты obj (используется параметр запроса obj) без передачи его в запрос и объект java, полученный из MySQL после выбора *.

Решение: в application.properties добавлено «spring.jpa.properties.hibernate.jdb c .time_zone = America / Los_Angeles». Это работало нормально, как и ожидалось.

Вопросы:
1. Есть ли способ, которым я могу выровнять MySQL TZ с пружинной загрузкой Java приложения TZ, переданного с аргументом "-Duser.timezone" динамически, т. е. путем выбора значения из аргумента?
2. В MySQL DB можно ли проверить часовой пояс каждого соединения? Подобно тому, как в, я могу увидеть список соединений из запроса "show processlist".

1 Ответ

0 голосов
/ 16 апреля 2020

tl; dr

Используйте java .time классы, чтобы избежать проблем с часовым поясом.

ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;
myPreparedStatament.setObject( … , java.time.OffsetDateTime.now( z ) ) ;   // Persisting
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;   // Retrieval
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;                           // Adjust into the wall-clock time used by the people of a particular region (a time zone). Same moment, same point on the timeline.

java .time

my Java Date obj

Классы Date (java.util.Date & java.sql.Date) оба ужасные, теперь унаследованные, вытесненные годы go современными java .time классами, определенными в JSR 310.

У меня есть сервер Ubuntu 16 в "IST" TZ.

К вашему сведению, для серверов обычно лучше всего устанавливать часовой пояс по умолчанию UT C (GMT), смещение нуля часов, минут и секунд. Имейте в виду, что у хост-системы есть собственный часовой пояс по умолчанию, а у JVM - свой собственный. А промежуточное программное обеспечение, такое как интерактивный сеанс с вашей базой данных, может иметь собственный текущий часовой пояс по умолчанию.

Как программист Java, вы никогда не должны полагаться на текущий часовой пояс по умолчанию. Любой код в любом потоке любого приложения в JVM может изменить значение по умолчанию в любой момент во время выполнения. Поэтому лучше указать ожидаемый / желаемый часовой пояс.

"spring.jpa.properties.hibernate.jdb c .time_zone = America / Los_Angeles"

Если вы обмениваетесь java .time классами с вашей базой данных, а не используете строки или устаревшие классы даты и времени, вам не понадобится этот параметр. JDB C 4.2, более поздние версии Hibernate и JPA 2.2 - все требуют поддержки java .time объектов.

Есть ли способ, которым я могу выровнять MySQL TZ с помощью весенней загрузки Java приложения TZ, передаваемого с аргументом "-Duser.timezone", то есть путем выбора значения из аргумента?

Если вы обмениваетесь java .time объектами с базой данных, этот вопрос становится спорным, проблема исчезает, и ваша жизнь становится проще.

In MySQL DB, я могу проверить часовой пояс каждого соединения? Подобно тому, как в, я вижу список соединений из запроса "show processlist".

То же самое, используйте java .time объектов, и вопрос становится спорным.

Пример кода

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

Для типа столбца, похожего на SQL стандарт DATE, используйте java.time.LocalDate.

ZoneId z = ZoneId.of( "Africa/Casablanca" ) ;
myPreparedStatament.setObject( … , LocalDate.now( z ) ) ;      // Persisting
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;  // Retrieval

Момент, точка на временной шкале

Для типа столбца, похожего на SQL стандарт TIMESTAMP WITH TIME ZONE, используйте java.time.OffsetDateTime (опционально Instant или ZonedDateTime).

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
myPreparedStatament.setObject( … , java.time.OffsetDateTime.now( z ) ) ;      // Persisting
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;  // Retrieval

Не мгновение, а только дата и время суток

Для типа столбца, похожего на SQL стандарт TIMESTAMP WITHOUT TIME ZONE, используйте java.time.LocalDateTime. Помните: отсутствие какой-либо концепции часового пояса или смещения от UT C означает, что этот тип данных не может представлять момент, это не точка на временной шкале.

myPreparedStatament.setObject( … , LocalDateTime.of( 2020 , Month.MAY , 15 , 22 , 0 , 0 , 0 ) ;  // Persisting
LocalDateTime let = myResultSet.getObject( … , LocalDateTime.class ) ;                           // Retrieval

Table of date-time types in Java (both legacy and modern) and in standard SQL


О java .time

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

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

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

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

Где взять классы java .time?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 и более поздних версий - часть стандартного API Java со связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 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… .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...