Я не уверен в точном поведении TimeZone.getAvailableIDs
(это не совсем хорошо задокументировано). Когда я запускаю ваш код на моей Java 9.0.4, первым идентификатором, который он возвращает, является America / Boise. В Бойсе, штат Айдахо, США, используется стандартное зимнее время в зимний период (UTC-07: 00) и летнее время в горах (UTC-06: 00). Вы установили format
, чтобы использовать это для анализа. Ваш формат анализирует 01
как часы дня (прописные буквы HH
, от 00 до 23) и 07
как часы внутри AM или PM (строчные буквы hh
, от 01 до 12). Так что здесь конфликт. Похоже, победит первый, я не знаю почему (не всегда настаиваю на понимании SimpleDateFormat
). Поскольку 31 июля в летнее время (DST), вы получаете время 01: 01-06: 00, равное 02:01 Североамериканское центральное летнее время (-05: 00). Что неверно.
ZonedDateTime.parse
правильно анализирует вашу строку. TimeZone.getTimeZone("CST").toZoneId()
интерпретирует CST как Америку / Чикаго (что, строго говоря, неверно, поскольку Чикаго использует CST только для незначительной части года). Так что в time2
вы получите 2017-07-31T03:01-05:00[America/Chicago]
, что правильно.
Для того, что я думаю, вы пытались получить, я рекомендую:
ZonedDateTime dateTime = OffsetDateTime.parse(dateStr)
.atZoneSameInstant(ZoneId.of("America/Chicago"));
System.out.println(dateTime.toLocalDateTime());
Выход совпадает с вашим вторым выходом:
2017-07-31T03: 01
Если вы сочтете это более подходящим для вашей ситуации, вместо Америки / Чикаго вы можете рассмотреть, например, Америку / Баия_Бандерас, Америку / Индиану / Нокс, Америку / Индиану / Телл-Сити, Америку / Матаморос, Америку / Меномини или Америку / Виннипег , Не полагайтесь на трех- или четырехбуквенное сокращение часового пояса. CST не является истинным часовым поясом, поскольку он используется только в течение некоторого года, и он неоднозначен, он может относиться к центральному стандартному времени Австралии, центральному стандарту Северной и Центральной Америки, стандартному времени Китая или стандартному времени Кубы. И нет никакой гарантии, какую Java вам даст.