ТЛ; др
Instant.ofEpochSecond( 1_493_367_302L ) // Convert a count of whole seconds from epoch of 1970 into a date-time value in UTC.
.atZone( ZoneId.of( "Pacific/Auckland" ) ) // Adjust into the time zone as a context for determining a date.
.toLocalDate() // Extract a date-only value by which we can sort/collect/organize our date-time values.
Часовой пояс
Класс java.util.Date
представляет момент на временной шкале в UTC. Таким образом, запрос даты назначает дату, которая имеет смысл только в UTC. В тот же момент может быть дата раньше в Квебеке или дата позже в Окленде, Новая Зеландия.
Часовой пояс имеет решающее значение при определении даты, и ваш Вопрос игнорирует эту проблему.
Использование java.time
Класс java.util.Date
является частью проблемных старых классов даты и времени, которые теперь унаследованы, заменены классами java.time.
Что касается високосных секунд, как предлагали другие Ответы, большинство источников отсчета с эпохи не подсчитывают високосные секунды. Так что проверьте свой источник.
Если у вас есть количество полных секунд от эпохи 1970-01-01T00:00:00
, используйте статический метод для создания объекта Instant
.
Instant instant = Instant.ofEpochSecond( 1_493_367_302L ) ;
instant.toString (): 2017-04-28T08: 15: 02Z
Назначьте часовой пояс, чтобы создать контекст, в котором мы можем определить дату. В любой данный момент дата варьируется по всему миру в зависимости от зоны.
Укажите собственное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 3-4-буквенное сокращение, такое как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString (): 2017-04-28T01: 15: 02-07: 00 [America / Los_Angeles]
С кучей этих ZonedDateDate
объектов вы можете сравнить по дате. Вы можете извлечь LocalDate
объект. Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса.
LocalDate ld = zdt.toLocalDate();
ld.toString (): 2017-04-28
Таким образом, вы можете создать Map
с LocalDate
в качестве ключа и List
или Set
из ZonedDateTime
объектов в качестве значения. А с современным лямбда-синтаксисом вы можете использовать Streams для этого отображения.
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .