java 8 ZonedDateTime не печатает текущее время EST. Что я тут не так делаю

a, b = 0, 1
while b < 10:
print(b)
a, b = b, a+b

Выход

1
1
2
3
5
8

переменные a и b одновременно получают новые значения 0 и 1, то же a, b = b, a + b, a и b назначаются одновременно.

0
задан azro 4 March 2019 в 22:06
поделиться

2 ответа

Попробуйте что-то вроде:

 LocalDateTime datetime = LocalDateTime .now(ZoneId.of ( "America/New_York" ));

       System.out.println(datetime.format(DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss.SSS")));
0
ответ дан MS90 4 March 2019 в 22:06
поделиться

tl; dr

Вы зафиксировали дату и время дня в Аризоне, а затем нанесли удар по часовому поясу, чтобы заявить (неверно), что в этот момент в Нью-Йорке одинаковое время суток.

Поэтому, конечно, когда вы генерировали текст для отображения этих значений, вы видели время суток, впервые зафиксированное в Аризоне. Ни в коем случае вы не настраивали из Аризоны в Нью-Йорк.

LocalDateTime неправильный класс

Никогда не используйте LocalDateTime для отслеживания моментов. По определению, этот класс не может представлять определенный момент времени, точку на временной шкале. Он содержит дату и время суток, но в нем отсутствует контекст часового пояса или смещения от UTC. Говорить нам «Полдень 23 января этого года» бессмысленно, если мы не знаем, имели ли вы в виду полдень в Токио, Японии, Калькутте, Париже, Монреале и Квебеке - все это были разные моменты, с разницей в несколько часов.

Всегда указывайте часовой пояс

Чтобы использовать неправильный класс, вы позвонили LocalDateTime.now, не указав часовой пояс. Таким образом, текущий часовой пояс по умолчанию для вашей JVM был применен неявно. Вы утверждаете, что по умолчанию используется часовой пояс в Аризоне. Так что это будет зона применения.

Итак, вы запечатлели дату & amp; время суток, как видно в Аризоне. Но затем вы отказались от того факта, что значение было в часовом поясе Аризоны, из-за того, что вы использовали LocalDateTime. Отказ от часового пояса - это весь смысл класса LocalDateTime. Есть случаи, когда это полезно, но, конечно, не в вашей ситуации.

Вы тогда взяли ту дату в Аризоне & amp; время суток, и утверждал, что это дата и время в Нью-Йорке. Фактическое время дня в Нью-Йорке было на несколько часов раньше, так что вы сказали выдумку. Наконец, вы сгенерировали текст, показывающий эту выдумку.

Другими словами, по-видимому, вы подумали об этой строке:

ZonedDateTime.of ( datetime , ZoneId.of ( "America/New_York" ) )

… с поправкой от Аризоны до Нью-Йорка. Но этот аргумент datetime больше не знает, что он пришел из Аризоны, потому что LocalDateTime не имеет понятия зоны / смещения . Никаких корректировок не было.

Вы можете думать об этом так:

LocalDateTime = дата + время суток

OffsetDateTime = дата + время суток + смещение

ZonedDateTime = дата + время суток + зона

Instant = дата + время суток + UTC

Вместо этого Я рекомендую всегда указывать явно желаемый / ожидаемый часовой пояс. Даже если вам нужен текущий часовой пояс по умолчанию, скажите об этом явно, вызвав ZoneId.systemDefault, чтобы любой программист, читающий ваш код, четко знал ваше намерение. Разрешение часового пояса или смещения от UTC является необязательным - это одна из немногих вещей, которые я бы изменил в другом удивительном дизайне класса, найденном в java.time . Создание требуемых аргументов зоны / смещения поможет обучить больше программистов работе с датой и временем.

ZonedDateTime - это правильный класс

Чтобы представить момент, который виден через часы настенного времени, используемые людьми определенного региона (часового пояса), используйте ZonedDateTime.

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

См. Этот код , запущенный в режиме реального времени на IdeOne.com .

zdt.toString (): 2019-03-04T18: 17: 08.014-05: 00 [America / New_York]

Создать текст

Мы можем легко сгенерируйте нужный текст.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu HH:mm:ss.SSS" ) ;
String output = zdt.format( f ) ;

См. Этот код, запущенный на IdeOne.com .

03/04/2019 18: 17: 08.014

Настройка зон

Если вы хотите выполнить настройку между зонами, позвоните в [1118 ] метод.

ZonedDateTime zdtPhoenix = ZoneDateTime.now( ZoneId.of( "America/Phoenix" ) ) ;
ZonedDateTime zdtNewYork = zdtPhoenix.withZoneSameInstant( ZoneId.of( "America/New_York" ) ) ;  // Same moment, same point on the timeline, different wall-clock time.

Обратите внимание на фразу SameInstant, которая означает, что вы хотите один и тот же момент, ту же самую одновременную точку на временной шкале, но вы хотите видеть это через время настенных часов, которое используют жители региона Нью-Йорка.

Часовые пояса

выводят текущее время даты EST

Укажите собственное имя часового пояса в формате Continent/Region, такой как America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте и не обращайтесь к 2-4 буквенным аббревиатурам, таким как EST или IST, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

0
ответ дан Basil Bourque 4 March 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: