tl; др
Instant
.ofEpochMilli( 0L )
.atOffset(
ZoneOffset.UTC
)
.toLocalDate()
.toString()
1970-01-01
java.util.Date
java.util.Date
представляет момент в UTC,дата с временем суток.
Ваш код:
new Date(0L)
… произвел объект, представляющий первый момент 1970 года в UTC, 1970-01-01T00: 00: 00Z.
Часовой пояс
В тот же момент, попросив кого-нибудь по телефону в Индии сообщить вам время дня, которое они видят на часах, вы получите ответ «5:30».AM».Часовой пояс Asia/Kolkata
в тот момент использовал смещение на пять с половиной часов впереди UTC.
Если вы позвоните кому-нибудь из Монреаля в Квебеке, вы получите ответ «7 вечера… даты 1969-12-31».Часовой пояс America/Montreal
на эту дату использовал смещение в пять часов после UTC.Быть на часах позади полуночи в UTC означает быть в день позади, тоже в последний день 1969 года, а не в первый день 1970 года. То же самое для зоны America/New_York
и большей части восточного побережья Северной Америки.
Итак, вы должны понимать, что в любой данный момент дата меняется по всему земному шару, дата меняется в зависимости от зоны.Когда в Японии наступает новый день, например, в Бразилии это «вчера».
java.time
Класс Date
ужасен и никогда не должен использоваться .Наряду с Calendar
это теперь наследие, вытесненное годами назад классами java.time .В частности, Date
заменяется на Instant
, оба класса представляют момент в UTC.
Instant instant = Instant.ofEpochMilli( 0L ) ;
instant.toString (): 1970-01-01T00: 00Z
Настройте время настенных часов, используемое людьми определенного региона,часовой пояс.Примените ZoneId
, чтобы получить ZonedDateTime
объект.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Извлечение части, содержащей только дату, без времени суток и без зоны.
LocalDate ld = zdt.toLocalDate() ;
ld.toString (): 1969-12-31
Если вы хотите остаться в UTC, примените ZoneOffset
константу ZoneOffset.UTC
вместо ZoneId
.И получите OffsetDateTime
, а не ZonedDateTime
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
Извлечение значения только для даты, a LocalDate
.
LocalDate ld = odt.toLocalDate() ;
ld.toString (): 1970-01-01