Часовой пояс Java силы как GMT/UTC

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

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

Спасибо!

87
задан SyBer 13 April 2010 в 08:27
поделиться

2 ответа

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

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

Если вам нужно установить определенные часовые пояса при получении даты Объекты / 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

114
ответ дан 24 November 2019 в 07:48
поделиться

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

См. SimpleDateFormat.setTimeZone(...) и Calendar.setTimeZone(...) для подробностей

.
6
ответ дан 24 November 2019 в 07:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: