2016-02-07 2 views
3

Я пытаюсь проанализировать отметку времени в США/Алеутском. Это работало в прошлом, и я не мог понять, почему он больше не работает. Я бегу Java 1.8 обновление 72.Java 1.8 отказывается разбирать даты с часовым поясом US/Aleutian (HAST)?

код выглядит следующим образом:

try { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"); 
     sdf.setTimeZone(TimeZone.getTimeZone("US/Aleutian")); 

     // the following line throws an parsing exception 
     Date d = sdf.parse("1969-12-31T13:00:00HAST"); 
     System.out.println(sdf.format(d)); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

... Date d = sdf.parse("1969-12-31T13:00:00HAST"); линия бросает исключение, но я не могу узнать, что случилось с ним:

java.text.ParseException: Unparseable date: "1969-12-31T13:00:00HAST" 
    at java.text.DateFormat.parse(Unknown Source) 

Я уверен, что это сработало в прошлом. Я исследовал часовой пояс HAST, и он действителен. Я не знаю, почему это не работает для меня.

Может ли кто-нибудь узнать, что происходит? Если это сработает для вас, можете ли вы перечислить свою версию java, чтобы мы могли узнать, когда/когда это сломалось?

Спасибо!

+1

'TimeZone.getTimeZone (« HAST »)' теперь возвращает GMT, который согласно [документации] (https://docs.oracle.com/javase/8/docs/api/java/util/TimeZone.html # getTimeZone-java.lang.String-) указывает, что запрошенный идентификатор TimeZone не был понят. Я не знаю, почему HAST больше не принимается. – VGR

+0

Вау! Это странно ... Я не уверен, что это похоже на ошибку в самой Java. Но странно. Почему это будет удалено ?! o.O –

+1

Я рекомендую использовать идентификатор вместо синонима: 'America/Adak' (вместо« US/Aleutian »), когда это возможно. –

ответ

4

Найдено ответ.

Согласно this, что аббревиатура была удален в Java 6 Update 101:

«Сокращения для Гавайев Алеутских стандартного и дневного времени были изменены с HAST/HADT до HST/HDT, в соответствии с правительством США Печати Офисный стиль. Это касается только Америки/Адака с 1983 года, поскольку Америка/Гонолулу уже использует новый стиль ».

Итак, я пойду вперед и использую HST.

Спасибо за вход всем!

-1

SimpleDateFormat - это старый класс, который имеет некоторые проблемы. Попробуйте использовать класс java.time.format.DateTimeFormatter, который новый класс в Java 8. Попробуйте что-то вроде этого:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssz"); 
    Instant instant = formatter.parse("1969-12-31T13:00:00HAST", Instant::from); 
    Date date = Date.from(instant); 
+0

Проблема в том, что я прохожу SimpleDateFormat в Jackson, библиотеку JSON. Он использует SimpleDateFormat внутренне. Возможно, я попытаюсь найти способ заставить Джексона использовать что-то еще для синтаксического анализа, но мои варианты использования сложны, и это будет означать выполнение операции на открытом сердце в Джексоне. Если бы я мог узнать, что происходит с SimpleDateFormat, и этот синтаксический анализ будет правильным, это будет намного лучше. –

+0

На самом деле для JSON вы должны отформатировать дату в String и передать JSON только строки. Смысл получить формат даты его в строку нужного формата и передать его в JSON –

+0

Это строка. Ввод - это что-то вроде '{" date ":" 1969-12-31T14: 00: 00HAST "}'. Я использую Джексона, чтобы разобрать это, и Джексон берет старую школу 'DateFormat', чтобы настроить формат дат в анализируемом JSON. Поэтому мне нужно, чтобы SimpleDateFormat обрабатывал этот часовой пояс. –