Принудительно использовать часовой пояс Java как GMT / UTC - PullRequest
84 голосов
/ 13 апреля 2010

Мне нужно принудительно переводить любые операции, связанные с временем, в GMT / UTC, независимо от часового пояса, установленного на машине. Любой удобный способ так в коде?

Для пояснения я использую время сервера БД для всех операций, но оно отформатировано в соответствии с местным часовым поясом.

Спасибо!

Ответы [ 10 ]

107 голосов
/ 13 апреля 2010

ОП ответил на этот вопрос, чтобы изменить часовой пояс по умолчанию для одного экземпляра работающей JVM, установите системное свойство user.timezone:

java -Duser.timezone=GMT ... <main-class>

Если вам нужно установить определенные часовые пояса при получении объектов Date / Time / Timestamp из базы данных ResultSet, используйте вторую форму методов getXXX, которая принимает объект Calendar:

Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
ResultSet rs = ...;
while (rs.next()) {
    Date dateValue = rs.getDate("DateColumn", tzCal);
    // Other fields and calculations
}

Или, установка даты в PreparedStatement:

Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
PreparedStatement ps = conn.createPreparedStatement("update ...");
ps.setDate("DateColumn", dateValue, tzCal);
// Other assignments
ps.executeUpdate();

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

Классы java.util.Date и java.sql.Date хранят фактическое время (миллисекунды) в UTC. Чтобы отформатировать их при выводе в другой часовой пояс, используйте SimpleDateFormat. Вы также можете связать часовой пояс со значением, используя объект Calendar:

TimeZone tz = TimeZone.getTimeZone("<local-time-zone>");
//...
Date dateValue = rs.getDate("DateColumn");
Calendar calValue = Calendar.getInstance(tz);
calValue.setTime(dateValue);

Полезная ссылка

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

20 голосов
/ 13 февраля 2013

Также, если вы можете установить часовой пояс JVM таким образом

System.setProperty("user.timezone", "EST");

или -Duser.timezone=GMT в аргументах JVM.

10 голосов
/ 19 февраля 2011

Мне пришлось установить часовой пояс 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

8 голосов
/ 23 апреля 2013

для меня, просто быстрый SimpleDateFormat,

  private static final SimpleDateFormat GMT = new SimpleDateFormat("yyyy-MM-dd");
  private static final SimpleDateFormat SYD = new SimpleDateFormat("yyyy-MM-dd");
  static {
      GMT.setTimeZone(TimeZone.getTimeZone("GMT"));
    SYD.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
  }

затем отформатируйте дату в другом часовом поясе.

6 голосов
/ 13 апреля 2010

Я бы извлек время из БД в необработанном виде (длинная метка времени или дата Java), а затем использовал бы SimpleDateFormat для его форматирования или Календарь для манипулирования им. В обоих случаях вы должны установить часовой пояс объектов перед его использованием.

Подробнее см. SimpleDateFormat.setTimeZone(..) и Calendar.setTimeZone(..)

4 голосов
/ 13 декабря 2012

Вы можете изменить часовой пояс, используя TimeZone.setDefault () :

TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
1 голос
/ 02 августа 2016

Ничего себе. Я знаю, что это древний поток, но все, что я могу сказать, это не вызывать TimeZone.setDefault () в любом коде пользовательского уровня. Это всегда устанавливает часовой пояс для всей JVM и почти всегда очень плохая идея. Научитесь использовать библиотеку joda.time или новый класс DateTime в Java 8, который очень похож на библиотеку joda.time.

1 голос
/ 19 мая 2013

создайте пару клиент / сервер, чтобы после выполнения клиентский сервер отправлял правильные время и дату. Затем клиент запрашивает у сервера вечера по Гринвичу и сервер отправляет обратно правильный ответ.

0 голосов
/ 09 апреля 2019

Использовать системное свойство:

-Duser.timezone=UTC
0 голосов
/ 10 сентября 2014

Если вы хотите получить время по Гринвичу только с помощью 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'

currentTime.setFullYear(currentYear);
currentTime.setMonth((currentMonth-1)); //0is January
currentTime.setDate(currentDay);  
currentTime.setHours(currentHours);
currentTime.setMinutes(currentMinutes);
currentTime.setSeconds(currentSeconds);
currentTime.setMilliseconds(currentMilliseconds);

var currentTimezone = currentTime.getTimezoneOffset();
currentTimezone = (currentTimezone/60) * -1;
var gmt ="";
if (currentTimezone !== 0) {
  gmt += currentTimezone > 0 ? ' +' : ' ';
  gmt += currentTimezone;
}
alert(gmt)
...