Я должен вызвать любые связанные со временем операции к GMT/UTC, независимо набор часового пояса на машине. Какой-либо удобный способ к так в коде?
Для разъяснения я использую время сервера БД для всех операций, но оно выходит отформатированное согласно локальному часовому поясу.
Спасибо!
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
Я бы получил время из БД в сыром виде (длинная временная метка или java's Date), а затем использовал SimpleDateFormat для его форматирования или Calendar для работы с ним. В обоих случаях вы должны установить часовой пояс объектов перед использованием.
См. SimpleDateFormat.setTimeZone(...)
и Calendar.setTimeZone(...)
для подробностей