Java - хранить время по Гринвичу
- Мой сервер имеет GMT+7, поэтому, если я перейду на другой сервер с другим часовым поясом GMT, вся дата, сохраненная в БД, будет неправильной?
- Да, Q1 правильно, как насчет того, чтобы сохранить дату в часовом поясе GMT +0 и отобразить ее в пользовательском часовом поясе GMT, выбранном каждым участником?
- Как я могу получить дату с GMT+0 в Java
5 ответов
1) Чтобы процитировать из Javadocs, метки времени Java миллисекунды являются
разница, измеренная в миллисекундах, между текущим временем и полуночью 1 января 1970 года по Гринвичу.
Поэтому, поскольку отметка времени - UTC/GMT, если вы сохраните ее в базе данных, эта дата будет правильной независимо от часового пояса сервера.
2) Правильный подход - форматирование временной метки для отображения в зависимости от часового пояса.
3) Создание нового экземпляра java.util.Date и вызов getTime() даст вам метку времени для GMT+0 в Java.
Чтобы добавить к точке отметки, как только у вас есть java.util.Date, вы можете "конвертировать" его в любой часовой пояс (по выбору пользователя). Вот пример кода в Groovy (будет работать на Java с небольшими модами):
// This is a test to prove that in Java, you can create ONE java.util.Date
// and easily re-display it in different TimeZones
fmtStr = "MM/dd/yyyy hh:mm aa zzz"
myDate = new java.util.Date()
sdf = new java.text.SimpleDateFormat(fmtStr)
// Default TimeZone
println "Date formatted with default TimeZone: " + sdf.format(myDate)
// GMT
sdf.setTimeZone(TimeZone.getTimeZone("GMT"))
println "Date formatted with GMT TimeZone: " + sdf.format(myDate)
// America/New_York
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"))
println "Date formatted with America/New_York TimeZone: " + sdf.format(myDate)
// PST
sdf.setTimeZone(TimeZone.getTimeZone("PST"))
println "Date formatted with PST TimeZone: " + sdf.format(myDate)
По умолчанию, когда вы получаете дату в java, которая находится в вашем текущем часовом поясе, вы можете использовать класс TimeZone для получения часового пояса, в котором работает ваше системное время. Большинство баз данных поддерживает сохранение дат в часовом поясе, что, вероятно, будет правильным способом. чтобы сделать это, но какой именно формат может зависеть от того, какую базу данных вы используете.
Для Q3 рассмотрите возможность использования класса ZonedDateTime.
Я хотел бы предложить, чтобы вы использовали Date только в качестве "держателя" и предлагали вместо этого использовать экземпляры Calendar. Чтобы получить календарь в часовом поясе GMT просто используйте это:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+00"))
Календарь обеспечит большую выгоду, когда вы работаете с временем и датами. Например, добавить час к этому просто:
cal.add(Calendar.HOUR, 1);
Наконец, когда вам нужна дата, вы просто используете это:
Date date = cal.getTime();