Никогда не используйте Calendar
Ужасный класс Calendar
был вытеснен java.time классами лет назад, в частности ZonedDateTime
.
Часовой пояс
Вы игнорируете важнейшую проблему часового пояса.Дата и время суток не имеют реального значения, пока вы не укажете контекст часового пояса (или смещение от UTC).Например, полдень Europe/Paris
намного позже, чем полдень в Asia/Tokyo
и намного раньше, чем полдень в America/Montreal
.
ZonedDateTime
Представляет дату и время суток с часовым поясом с классом ZonedDateTime
.
ZoneID
Укажите собственное имя часового пояса в формате Continent/Region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
truncatedTo
Если вы хотите установить вторую и дробную секунды как ноль, усечь до минуты.
ZonedDateTime zdt = ZonedDateTime.now( z ).truncatedTo( ChronoUnit.MINUTES ) ; // Set the whole second and the fractional second both to zero.
LocalDateTime
Если для целей подсчета вы хотите учитывать только дату с временем суток, игнорируя часовой пояс, извлеките LocalDateTime
.LocalDateTime
- это просто дата с указанием времени суток, в которой отсутствует понятие часового пояса или смещения от UTC.
LocalDateTime ldt = zdt.toLocalDateTime() ;
Map
➙ SortedMap
➙ TreeMap
С LocalDateTime
в руке вы можете считать.Сделайте Map
, где ключ - LocalDateTime
, а значение - Integer
.
Полагаю, вы позаботитесь о отсортированном порядке клавиш даты и времени, поэтому используйте SortedMap
.A TreeMap
является одной из таких реализаций.
SortedMap< LocalDateTime , Integer > map = new TreeMap() ;
Для каждого LocalDateTime
получить объект Integer
из Map
.Увеличьте счетчик чисел и замените старый объект Integer
новым.
Использование Map
уже много сотен, если не тысяч, уже было использовано при переполнении стека.Так что ищите, если вам нужно больше обсуждений и примеров этого.
О java.time
java.time Фреймворк встроен в Java 8 и новее.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time классы.
Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?