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 назначаются одновременно.
Попробуйте что-то вроде:
LocalDateTime datetime = LocalDateTime .now(ZoneId.of ( "America/New_York" ));
System.out.println(datetime.format(DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss.SSS")));
Вы зафиксировали дату и время дня в Аризоне, а затем нанесли удар по часовому поясу, чтобы заявить (неверно), что в этот момент в Нью-Йорке одинаковое время суток.
Поэтому, конечно, когда вы генерировали текст для отображения этих значений, вы видели время суток, впервые зафиксированное в Аризоне. Ни в коем случае вы не настраивали из Аризоны в Нью-Йорк.
LocalDateTime
неправильный класс Никогда не используйте LocalDateTime
для отслеживания моментов. По определению, этот класс не может представлять определенный момент времени, точку на временной шкале. Он содержит дату и время суток, но в нем отсутствует контекст часового пояса или смещения от UTC. Говорить нам «Полдень 23 января этого года» бессмысленно, если мы не знаем, имели ли вы в виду полдень в Токио, Японии, Калькутте, Париже, Монреале и Квебеке - все это были разные моменты, с разницей в несколько часов.
Чтобы использовать неправильный класс, вы позвонили LocalDateTime.now
, не указав часовой пояс. Таким образом, текущий часовой пояс по умолчанию для вашей JVM был применен неявно. Вы утверждаете, что по умолчанию используется часовой пояс в Аризоне. Так что это будет зона применения.
Итак, вы запечатлели дату & amp; время суток, как видно в Аризоне. Но затем вы отказались от того факта, что значение было в часовом поясе Аризоны, из-за того, что вы использовали LocalDateTime
. Отказ от часового пояса - это весь смысл класса LocalDateTime
. Есть случаи, когда это полезно, но, конечно, не в вашей ситуации.
Вы тогда взяли ту дату в Аризоне & amp; время суток, и утверждал, что это дата и время в Нью-Йорке. Фактическое время дня в Нью-Йорке было на несколько часов раньше, так что вы сказали выдумку. Наконец, вы сгенерировали текст, показывающий эту выдумку.
Другими словами, по-видимому, вы подумали об этой строке:
ZonedDateTime.of ( datetime , ZoneId.of ( "America/New_York" ) )
… с поправкой от Аризоны до Нью-Йорка. Но этот аргумент datetime
больше не знает, что он пришел из Аризоны, потому что LocalDateTime
не имеет понятия зоны / смещения . Никаких корректировок не было.
Вы можете думать об этом так:
LocalDateTime
= дата + время суток
OffsetDateTime
= дата + время суток + смещение
ZonedDateTime
= дата + время суток + зонаblockquote>
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]
blockquote>Создать текст
Мы можем легко сгенерируйте нужный текст.
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
blockquote>Настройка зон
Если вы хотите выполнить настройку между зонами, позвоните в [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
blockquote>Укажите собственное имя часового пояса в формате
Continent/Region
, такой какAmerica/Montreal
,Africa/Casablanca
илиPacific/Auckland
. Никогда не используйте и не обращайтесь к 2-4 буквенным аббревиатурам, таким какEST
илиIST
, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).