Ответ Ole VV Правильно.Я добавлю немного обсуждения.
Существует только одна временная шкала, переживаемая всеми на Земле одновременно (игнорируя Эйнштейна и др.).По договоренности мы отслеживаем это время в UTC.
Научитесь думать о UTC как Единственное истинное время .Все другие смещения и зоны являются всего лишь вариацией UTC.Когда вы работаете программистом или системным администратором, забудьте о своем собственном приходском часовом поясе.Держите второй клик на вашем столе или время отслеживания стены в UTC.Делайте все ваши записи, отслеживание, хранение данных и обмен данными в UTC.
Базовый класс для отслеживания момента в UTC - java.time.Instant
.Объекты этого класса всегда находятся в UTC по определению.Этот класс заменяет java.util.Date
, который также представляет момент в UTC, но имеет много недостатков дизайна и никогда не должен использоваться.Instant
имеет разрешение наносекунд, меньше, чем миллисекунды Date
.
Для большей гибкости используйте класс OffsetDateTime
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
И снова.
Instant instant = odt.toInstant() ;
Смещение от UTC - это просто количество часов, минут и секунд.Часовой пояс гораздо больше.Часовой пояс - это история прошлых, настоящих и будущих изменений в смещении, используемом людьми определенного региона.
Чтобы использовать часовой пояс, примените ZoneId
, чтобы получить ZonedDateTime
.Этот класс вытесняет ужасные классы Calendar
и GregorianCalendar
.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZoneId( z ) ;
Возвращаясь снова.
Instant instant = zdt.toInstant() ;
Это zdt
, odt
и instant
все представляют тот же самый одновременный момент , ту же точку на временной шкале.
Наконец, прекратите использовать Date
и Calendar
.Sun, Oracle и сообщество JCP отказались от этих классов, когда приняли JSR 310, и вы тоже должны это делать.Эти классы наследства действительно ужасны.