Мне нужно принудительно установить любые операции, связанные со временем, в GMT / UTC, независимо от часового пояса, установленного на машине. Любой удобный способ сделать это в коде?
Чтобы уточнить, я использую время сервера БД для всех операций, но оно форматируется в соответствии с местным часовым поясом.
Спасибо!
Ответы:
OP ответил на этот вопрос, чтобы изменить часовой пояс по умолчанию для одного экземпляра запущенной JVM, установить
user.timezone
системное свойство:Если вам нужно установить определенные часовые пояса при извлечении объектов Date / Time / Timestamp из базы данных
ResultSet
, используйте вторую формуgetXXX
методов, которые принимаютCalendar
объект:Или, установив дату в PreparedStatement:
Это обеспечит согласованность значения, хранящегося в базе данных, когда столбец базы данных не хранит информацию о часовом поясе.
java.util.Date
Иjava.sql.Date
классы хранить фактическое время (миллисекунды) в формате UTC. Чтобы отформатировать их при выводе в другой часовой пояс, используйтеSimpleDateFormat
. Вы также можете связать часовой пояс со значением с помощью объекта Calendar:Полезная ссылка
https://docs.oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm#JSTGD377
https://confluence.atlassian.com/kb/setting-the-timezone-for-the-java-environment-841187402.html
источник
Также, если вы можете установить часовой пояс JVM таким образом
или
-Duser.timezone=GMT
в аргументах JVM.источник
System.setProperty("user.timezone" ...)
не работает.Мне пришлось установить часовой пояс JVM для Windows 2003 Server, потому что он всегда возвращал GMT для новой даты ();
-Duser.timezone=America/Los_Angeles
Или подходящий часовой пояс. Найти список часовых поясов тоже оказалось непросто ...
Вот два списка;
http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm
источник
Вы можете изменить часовой пояс с помощью TimeZone.setDefault () :
источник
для меня просто быстрый SimpleDateFormat,
затем отформатируйте дату с другим часовым поясом.
источник
Я бы получил время из БД в необработанном виде (длинная временная метка или дата Java), а затем использовал бы SimpleDateFormat для его форматирования или Calendar для управления им. В обоих случаях вы должны установить часовой пояс объектов перед его использованием.
Смотрите
SimpleDateFormat.setTimeZone(..)
иCalendar.setTimeZone(..)
подробностиисточник
tl; dr
Избегайте зависимости от ОС хоста или JVM для часового пояса по умолчанию
Я рекомендую вам написать весь свой код, чтобы явно указать желаемый / ожидаемый часовой пояс. Вам не нужно зависеть от текущего часового пояса JVM по умолчанию. И имейте в виду, что текущий часовой пояс JVM по умолчанию может измениться в любой момент во время выполнения с любым кодом в любом потоке любого вызываемого приложения
TimeZone.setDefault
. Такой вызов немедленно влияет на все приложения в этой JVM.java.time
Некоторые другие ответы были правильными, но теперь устарели. Ужасные классы времени и даты, связанные с самыми ранними версиями Java, были ошибочными, написанными людьми, которые не понимали сложности и тонкости обработки даты и времени.
Унаследованные классы даты и времени были заменены классами java.time, определенными в JSR 310.
Чтобы представить часовой пояс, используйте
ZoneId
. Чтобы представить смещение от UTC, используйтеZoneOffset
. Смещение - это просто количество часов, минут и секунд вперед или назад от нулевого меридиана. Часовой пояс - это гораздо больше. Часовой пояс - это история прошлых, настоящих и будущих изменений смещения, используемого людьми определенного региона.Для смещения нуля часов-минут-секунд используйте константу
ZoneOffset.UTC
.Instant
Чтобы зафиксировать текущий момент в формате UTC, используйте расширение
Instant
. Этот класс представляет момент в формате UTC, всегда по определению в формате UTC.ZonedDateTime
Чтобы увидеть тот же самый момент через время на настенных часах, которое используют жители определенного региона, настройте часовой пояс. Тот же момент, та же точка на временной шкале, другое время на настенных часах.
База данных
Вы упоминаете базу данных.
Чтобы получить момент из базы данных, ваш столбец должен иметь тип данных, близкий к стандарту SQL
TIMESTAMP WITH TIME ZONE
. Получите объект, а не строку. В JDBC 4.2 и новее мы можем обмениваться объектами java.time с базой данных.OffsetDateTime
Требуется JDBC, в то время какInstant
и неZonedDateTime
являются обязательными.Я предполагаю, что в большинстве баз данных и драйверов вы получите момент, который отображается в формате UTC. Но если нет, вы можете настроить любой из двух способов:
Instant
:odt.toInstant()
О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как
java.util.Date
,Calendar
, иSimpleDateFormat
.Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в
java.sql.*
занятиях.Где взять классы java.time?
источник
создать пару клиент / сервер, чтобы после выполнения клиент-сервер отправлял правильное время и дату. Затем клиент запрашивает у сервера pm GMT, и сервер возвращает правильный ответ.
источник
Использовать системное свойство:
источник
Выполните эту строку в MySQL, чтобы сбросить часовой пояс:
источник
Вот это да. Я знаю, что это древний поток, но все, что я могу сказать, это не вызывать TimeZone.setDefault () в любом коде пользовательского уровня. Это всегда устанавливает часовой пояс для всей JVM и почти всегда является очень плохой идеей. Научитесь использовать библиотеку joda.time или новый класс DateTime в Java 8, который очень похож на библиотеку joda.time.
источник
Если вы хотите получить время по Гринвичу только с помощью intiger: var currentTime = new Date (); var currentYear = '2010' var currentMonth = 10; var currentDay = '30 'var currentHours = '20' var currentMinutes = '20 'var currentSeconds = '00' var currentMilliseconds = '00 '
источник