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](https://i.stack.imgur.com/GaYgh.png)
О 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?