Преобразование времени, представленного в виде строки, содержащей имена часовых поясов ('z'), во время UTC

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

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


person ovdsrn    schedule 26.02.2011    source источник
comment
Это не ответ на ваш вопрос, но будьте осторожны с этой строкой формата. Строчные hh предназначены только для разбора часов в полдня (0–12). Большинство людей хотели бы использовать ггггММддЧЧммсс (прописные ЧЧ). В документации Joda есть удобный список: joda-time.sourceforge .net / apidocs / org / joda / time / format /   -  person Tom    schedule 07.10.2013


Ответы (1)


Я нашел два решения твоей проблемы. Первый - установить часовой пояс по умолчанию на 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. Вот результат выполнения этого кода:

Сб, 3 июня, 08:33:34 EDT 2000

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

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

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

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

person Joe    schedule 26.02.2011
comment
Спасибо. Я использовал второе предложенное вами решение. - person ovdsrn; 26.02.2011
comment
+1 за последний пункт о сокращениях часовых поясов. Их список можно найти здесь. Кроме того, многие сокращения не стандартизированы. Например, вы можете увидеть HAST или HST на Гавайях. Лучше всего избегать их использования. - person Matt Johnson-Pint; 16.08.2013