Часовые пояса в Java / GWT (на стороне клиента) - PullRequest
8 голосов
/ 28 января 2010

[класс GWT на стороне клиента]

У меня есть объект Date ...

Date dataObject = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
                      .parse("2009-10-12T00:00:00.000);

Это отлично работает. Однако, когда я делаю:

dateObject.getTime();

Возвращает миллисекунды времени UNIX, используя GMT с переходом на летнее время, поэтому я не могу использовать время UNIX. Мне это нужно в UTC. Как мне это сделать?


В настоящее время я анализирую дату, и она возвращает мне:

'Thu Apr 16 08:46:20 GMT+100 2009' @ '1239867980191'

Однако дата, которую я передаю, на 1 час меньше, чем это время (7:46, а не 8:46!).

Как мне пройти в том, что это UTC? Или, если он не может использовать UTC (что было бы смешно), как я могу использовать GMT без перехода на летнее время?

Ответы [ 5 ]

5 голосов
/ 29 января 2010

Ваше последнее редактирование проясняет ситуацию.

По сути, вы запутались, и вы уже получили то, что хотели.

1239867980191 миллисекунд с начала эпохи до четверга, 16 апреля 2009 года, в 7:46: 20,191 в часовом поясе GMT. Тот же самый момент времени переводится в тот же день, но в 8: 46: 20.191 в часовом поясе GMT ​​+ 01. Если в вашей входной строке указано «7: 46: 20.191» и вы действительно получили 1239867980191 от Date.getTime(), то поздравляем, код синтаксического анализа понял, что ваш «7: 46: 20.191» интерпретируется как часовой пояс GMT, и сделал это правильно .

Если после вы получаете «8:46:20» при печати, это только потому, что вы используете часовой пояс GMT + 01 для отображения этого момента. Обратите внимание, что строка содержит GMT+100 точно, чтобы уведомить вас, что она использует этот часовой пояс для отображения. instant , который представляет экземпляр Date, тем не менее является именно тем моментом, который вы хотите, чтобы он содержал. Помните, что экземпляр Date представляет момент времени, для которого не применяется понятие часового пояса: часовые пояса используются для преобразования моментов в элементы календаря (дни, часы ...) и обратно.

Чтобы преобразовать Date в отображаемую строку, используйте DateTimeFormat.format(Date, TimeZone), которая позволяет указать часовой пояс, который вы хотите использовать для этой строки.

3 голосов
/ 28 января 2010

Поскольку класс Calendar не поддерживается в GWT, возможно, что-то хакерское будет работать так:

final String timezone = "GMT-07:00";
DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ");
long unix = dtf.parse("2009-10-12T00:00:00" + timezone).getTime();

Таким образом, вы можете предоставить правильную информацию о часовом поясе, хотя это должно быть поведение по умолчанию.

1 голос
/ 28 января 2010

Это наоборот. Экземпляр Date содержит время в миллисекундах с начала эпохи с использованием шкалы времени UTC (т.е. високосные секунды игнорируются). Это то, что Date.getTime() возвращает, и это то, что вы хотите.

Виновником здесь является парсер, который интерпретирует дату, которую вы даете, как строку в вашем местном часовом поясе. Если вы хотите, чтобы DateTimeFormat интерпретировал строку как дату и время, указанные в часовом поясе UTC, добавьте явный часовой пояс к анализируемой строке:

DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ")
    .parse("2009-10-12T00:00:00.000" + " GMT");

(Вышесказанное предполагает, что я правильно понял документацию GWT; я не пробовал.)

Просто чтобы быть ясным в моих записях: для всех практических целей нет разницы между "GMT" и "UTC", и нет летнего времени в часовом поясе GMT. Другие часовые пояса часто определяются как «GMT плюс или минус некоторое смещение», и смещение может меняться между летом и зимой. Например, часовой пояс в Нью-Йорке несколько эквивалентен «GMT-04» летом и «GMT-05» зимой.

0 голосов
/ 28 января 2010

Я вижу форматы, в которых предлагается ZZZZ ... но почему?

"yyyy-MM-dd'T'HH: mm: ss.SSSZ" будет соответствовать

"2009-10-12T00: 00: 00.000-0000"

Последняя часть является смещением от UTC; В Калифорнии (если использовать пример другого времени) летом будет -0800, -0700.

Как примечание, время по Гринвичу также всегда -0000. Вот почему британский летний часовой пояс - BST (British Summer Time, +0100).

0 голосов
/ 28 января 2010

Попробуйте Календарь объект.

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Date dataObject = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
                  .parse("2009-10-12T00:00:00.000);
cal.setTime(dataObject);
cal.getTimeInMillis();

Согласно API, getTimeInMillis () возвращает «текущее время в миллисекундах UTC от эпохи».

РЕДАКТИРОВАТЬ : как указано _bravado, API-интерфейс календаря в настоящее время недоступен для GWT ( Issue 603 ). Хотя для Java-приложения это подходящее время, оно здесь не сработает. В группе есть информация об использовании GMT.

РЕДАКТИРОВАТЬ : Отсутствует закрывающая скобка в вызове Calendar.getInstance ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...