2014-12-04 3 views
3

Я на America/Los_Angeles TZ, и когда я пытаюсь сделать полночь в America/Mazatlan TZ, я получаю следующее исключение:Дата В поддается синтаксическому анализу Америка/Mazatlan часовой пояс

Exception in thread "main" java.text.ParseException: Unparseable date: "12:00 AM" 

Вот мой код, чтобы воспроизвести это:

DateFormat dateFormat = new SimpleDateFormat("h:mm a"); 
    TimeZone timeZone = TimeZone.getTimeZone("America/Mazatlan"); 
    dateFormat.setTimeZone(timeZone); 
    dateFormat.setLenient(false); 
    Date parse = dateFormat.parse("12:00 AM"); 

Я знаю, комментируя вне setLenient(false) будет решить проблему, я просто не знаю, почему это исправление других часовых поясов в то же смещение, такие как America/Inuvik не вызывают проблем, как это.

Любая помощь была бы замечательной.

+0

Найдено, что это произошло: 'Америка/Эрмосильо',' Мексика/BajaSur', 'Америка/Bahia_Banderas' – Nicholas

ответ

3

Если не указать дату, 1970-01-01 используется.

time zone definition for Mazatlan показывает, что смещение основания переключилось с -08: 00 до -07: 00 в 1970 году. Это создает разрыв в локальное время, аналогичный обычному в течение spring-forward daylight saving time transition.

Существует час отсутствия местного времени, от полуночи до 1:00. Времена в этом диапазоне недействительны. Если предположить, что определение зоны правильно, это означает, что часы тикали вперед, как это:

======== UTC =======  ==== America/Mazatlan === 
1970-01-01T07:59:57Z  1969-12-31T23:59:57-08:00 
1970-01-01T07:59:58Z  1969-12-31T23:59:58-08:00 
1970-01-01T07:59:59Z  1969-12-31T23:59:59-08:00 
1970-01-01T08:00:00Z  1970-01-01T01:00:00-07:00 (transition!) 
1970-01-01T08:00:01Z  1970-01-01T01:00:01-07:00 
1970-01-01T08:00:02Z  1970-01-01T01:00:02-07:00 

Поэтому, если вы используете SimpleDateFormat - вы должны включать в себя дату, а не только время.

+0

Ничего себе. Спасибо, что сообщили мне об этом, кажется странным. Это имеет смысл, так как тестирование 12:15 утра также потерпело неудачу. – Nicholas

1

Если вы удалите строку,

dateFormat.setLenient(false); 

Ваш синтаксического анализа значение объекта становится

 Thu Jan 01 10:00:00 EET 1970 

Я не знаю, почему, но для America/Mazatlan TZ эта линия создает исключение.

Для America/Los_Angeles TZ и America/Inuvik TZ, использование dateFormat.setLenient(false) линии не дает какой-либо ошибки и результаты совпадают с America/Mazatlan TZ.

Thu Jan 01 10:00:00 EET 1970 
+0

Спасибо. Я отредактировал свой вопрос, чтобы заявить, что я знаю, что снисхождение вызывает проблему, я надеялся, что причина, по которой это ложь, вызывает проблему. – Nicholas

-1

Это потому, что вы dateFormat.setLenient(false); и 12:00 должны быть 'PM' не 'AM'

+0

Зачем это повлияло на этот часовой пояс? У других нет проблемы с этим, как есть, только «Америка/Мазатлан» – Nicholas

+0

@ Николас, я не знаю, как это понять, читая исходный код –

+0

Спасибо за помощь. Я пытаюсь понять, почему он так странно ведет себя с этим часовым поясом, когда я не вижу ничего необычного в этом. – Nicholas

Смежные вопросы