Java - хранить время по Гринвичу

  1. Мой сервер имеет GMT+7, поэтому, если я перейду на другой сервер с другим часовым поясом GMT, вся дата, сохраненная в БД, будет неправильной?
  2. Да, Q1 правильно, как насчет того, чтобы сохранить дату в часовом поясе GMT ​​+0 и отобразить ее в пользовательском часовом поясе GMT, выбранном каждым участником?
  3. Как я могу получить дату с 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();
Другие вопросы по тегам