tl;dr
Вы сказали:
он отображается как GMT-04:00, а не EST, как я ожидал.
Такие детали зависят от того, действует ли Locale.UK
или нет.
16/07/2017 19:28:33 GMT-04:00
⇐ Locale.UK
16/07/2017 19:28:33 EDT
⇐ Locale.US
16/07/2017 19:28:33 HAE
⇐ Locale.CANADA_FRENCH
➥ Для текстового обмена данными о дате и времени: (a) придерживайтесь стандартных форматов ISO 8601, и (b) использовать нулевое смещение, когда это целесообразно. Это делает спорным проблему № 147.
Подробности
Кстати, старайтесь избегать парсинга текста даты и времени с использованием псевдозон из 2–4 букв, таких как EST
, EDT
, IST
, CST
. Это нестандартные, неуникальные(!), слабые попытки дать подсказку относительно часового пояса и Действует летнее время (DST).
Используйте только зоны реального времени в формате Continent/Region
, например Europe/London
.
Вы сказали:
а не EST, как я ожидал
Летнее время (DST) действовало в эту дату и время в часовом поясе America/New_York
, а не стандартное время< /а>. Таким образом, вы должны ожидать EDT
, а не EST
.
Я предлагаю вам не усложнять ситуацию, встраивая вызовы в ваши println
операторы.
Вы должны указать Locale
, а не неявно полагаться на текущую локаль JVM по умолчанию, которая может измениться в любой момент во время выполнения. Обратите внимание, как я добавил .withLocale( locale )
к формированию объекта DateTimeFormatter
. Я указал Locale.UK
, потому что вы упомянули en_GB
в комментарии.
Итак, давайте изменим ваш код на это:
final Locale locale = Locale.US ; // Locale.UK versus Locale.US yield different outputs.
final String input = "16/07/2017 19:28:33 EST";
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/yyyy HH:mm:ss z" ).withLocale( locale ) ;
final ZonedDateTime zdt = ZonedDateTime.parse( input , formatter ) ;
final String zdtToString = zdt.toString() ;
final String zdtFormatted = zdt.format( formatter ) ;
… а также:
// Dump to console.
System.out.println( "input: " + input ) ;
System.out.println( "zdt: " + zdt ) ;
System.out.println( "zdtToString: " + zdtToString ) ;
System.out.println( "zdtFormatted: " + zdtFormatted ) ;
См. выполнение кода в реальном времени на IdeOne.com на Java 12.
input: 16/07/2017 19:28:33 EST
zdt: 2017-07-16T19:28:33-04:00[America/New_York]
zdtToString: 2017-07-16T19:28:33-04:00[America/New_York]
zdtFormatted: 16/07/2017 19:28:33 GMT-04:00
Если мы изменим эту локаль с Locale.UK
на Locale.US
, мы получим другой результат.
zdtFormatted: 16/07/2017 19:28:33 EDT
person
Basil Bourque
schedule
21.03.2021
.withZone(ZoneId.of("EST"))
кDateTimeFormatter.ofPattern(...)
- person Lino   schedule 21.03.2021Locale.UK
. Интересно. Он анализирует в2017-07-16T19:28:33-04:00[America/New_York]
, что неудивительно, но затем форматирует в16/07/2017 19:28:33 GMT-04:00
, что, честно говоря, для меня. - person Ole V.V.   schedule 22.03.2021