Преобразовать время, представленное в виде строки, содержащей имена часовых поясов ('z'), во время UTC - PullRequest
3 голосов
/ 26 февраля 2011

Я хочу преобразовать строки типа "20000603163334 GST" или "20000603163334 -0300" в UTC. Проблема в том, что часовые пояса в моих строках могут быть «общими часовыми поясами», я имею в виду, что они могут быть строками, такими как CET, GST и т. Д. И т. Д. И я не знаю, как их преобразовать.

Из-за этих строковых часовых поясов я не могу использовать Joda Time's DateTimeFormat.forPattern("yyyyMMddhhmmss z").withZone(DateTimeZone.UTC);, потому что согласно документации: "Имена часовых поясов ('z') не могут быть проанализированы" .

Итак, у меня есть один вопрос: знаете ли вы способ обойти это ограничение в Joda Time? Я бы предпочел использовать Joda Time, если это возможно, вместо стандартного Java API.

Другой способ, с помощью которого я решил, что могу решить эту проблему с именами часовых поясов, - это использование SimpleDateFormat в Java. Поэтому я делаю что-то вроде:

SimpleDateFormat f = new SimpleDateFormat("yyyyMMddhhmmss z");
//f.setTimeZone(TimeZone.getTimeZone("UTC"));
f.setCalendar(new GregorianCalendar(TimeZone.getTimeZone("UTC")));
Date time = f.parse("20000603163334 GST");

SimpleDateFormat анализирует String (меня не волнует проблема, связанная с тем, что существует несколько часовых поясов с одинаковым именем - то, что этот класс анализирует, полезно для меня).

Проблема в том, что я не знаю, как конвертировать его отсюда в UTC. Как я могу это сделать?

Тот факт, что я установил часовой пояс f's на UTC (в обоих случаях сверху), не помогает. Я надеюсь, что кто-то может помочь мне исправить это, я прочитал много вопросов и ответов по этой теме здесь, в stackoverflow, но я пока не нашел решения.

1 Ответ

6 голосов
/ 26 февраля 2011

Я нашел два решения вашей проблемы.Первым было установить часовой пояс по умолчанию на UTC:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

Я не уверен, какой другой побочный эффект это может иметь.

Второе решение, которое я нашел, состояло в том, чтобы использовать другойSimpleDateFormat для вывода.

SimpleDateFormat f = new SimpleDateFormat("yyyyMMddhhmmss z");
f.setTimeZone(TimeZone.getTimeZone("UTC"));
Date time = f.parse("20000603163334 GST");
System.out.println(time);
System.out.println("(yyyyMMddhhmmss z):  " + f.format(time));

SimpleDateFormat utc = new SimpleDateFormat("yyyyMMddhhmmss z");
utc.setTimeZone(TimeZone.getTimeZone("UTC"));

System.out.println("(yyyyMMddhhmmss z):  " + utc.format(time));

Использование двух объектов SimpleDateFormat позволило поместить вывод в UTC Time.Вот результат выполнения этого кода:

Сб. 03 июня 08:33:34 ПО ВОСТОЧНОМУ ВРЕМЕНИ 2000

(ггггММддччммсс z): 20000603043334 GST

(ггггММддччмммм z): 20000603123334 UTC

Здесь может быть причина, по которой Joda не поддерживает трехбуквенные идентификаторы зон.Это из TimeZone (http://download.oracle.com/javase/6/docs/api/java/util/TimeZone.html) JavaDoc.Что касается Joda, я не видел обходного пути, но я не очень знаком с этой библиотекой.

Трехбуквенные идентификаторы часовых поясов Для совместимости с JDK 1.1.x, некоторые другиетакже поддерживаются трехбуквенные идентификаторы часовых поясов (такие как «PST», «CTT», «AST»).Однако их использование не рекомендуется, потому что одна и та же аббревиатура часто используется для нескольких часовых поясов (например, «CST» может быть «Центральное стандартное время США» и «Стандартное китайское время»), и тогда платформа Java может распознавать только одно изих.

...