Заставить часовой пояс Java как GMT/UTC
Мне нужно заставить любые связанные с временем операции работать с GMT/UTC, независимо от того, установлен ли часовой пояс на машине. Любой удобный способ сделать это в коде?
Чтобы уточнить, я использую время сервера БД для всех операций, но оно выводится в соответствии с локальным часовым поясом.
Спасибо!
Ответы
Ответ 1
ОП ответил на этот вопрос, чтобы изменить часовой пояс по умолчанию для отдельного экземпляра работающей 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
Ответ 2
Также, если вы можете установить часовой пояс JVM таким образом
System.setProperty("user.timezone", "EST");
или -Duser.timezone=GMT
в аргументах JVM.
Ответ 3
Мне пришлось установить часовой пояс JVM для Windows 2003 Server, потому что он всегда возвращал GMT для новой Date();
-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
Ответ 4
для меня, просто быстрый 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"));
}
затем отформатируйте дату с другим часовым поясом.
Ответ 5
Я бы извлек время из БД в необработанной форме (длинная метка времени или дата java), а затем используйте SimpleDateFormat для ее форматирования или Calendar для управления им. В обоих случаях вы должны установить часовой пояс объектов перед его использованием.
Подробнее см. SimpleDateFormat.setTimeZone(..)
и Calendar.setTimeZone(..)
Ответ 6
Вы можете изменить часовой пояс, используя TimeZone.setDefault():
TimeZone.setDefault(TimeZone.getTimeZone("GMT"))
Ответ 7
создать пару клиентов/серверов, чтобы после выполнения клиентский сервер отправил правильное время и дату. Затем клиент запрашивает сервер pm GMT, и сервер отправляет ответ правильно.
Ответ 8
Ого. Я знаю, что это древний поток, но все, что я могу сказать, не вызывает TimeZone.setDefault() в любом коде уровня пользователя. Это всегда задает часовой пояс для всей JVM и почти всегда очень плохая идея. Научитесь использовать библиотеку joda.time или новый класс DateTime в Java 8, который очень похож на библиотеку joda.time.
Ответ 9
Используйте системное свойство:
-Duser.timezone=UTC
Ответ 10
Если вы хотите получить время по Гринвичу только с помощью 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)