Работа с датами в JVM #

Васильев Андрей Михайлович, 2024

Версии презентации

Даты — это сложно #

В повседневной жизни даты кажутся достаточно простыми, всегда можно договориться о встрече в 19:30 в четверг на следующей неделе

  • Указанная дата относительна текущего момента времени
  • Хорошо, если место встречи географически близкое, в противном случае надо учесть часовые пояса текущего места и места встречи
  • За это время может произойти смена летнего / зимнего времени
  • В это время может случиться добавление 1 секунды для согласования солнечного времени
  • За 2 недели может случиться, а может не случиться 29 февраля
  • Если мы будем общаться по телефону и скажем, что встреча будет в “семь тридцать”, то это будет 7:30 или 19:30?
  • Разработчики Kotlin не готовы предоставить свои классы для описания даты

Дата и время в JVM #

Почти с самого начала в рамках JVM поставлялись классы java.util.Date, java.util.Time, которые не учитывали многие из поднятых вопросов

В рамках выпуска Java 8 был представлен пакет java.time, включающий классы LocalDateTime, LocalDate и другие

  • Обеспечивают поточную безопасность, т.к. неизменяемые
  • Предоставляют широкий список методов для манипулирования и датами
  • Предоставлены Zoned-классы с поддержкой часовых поясов

Работа с классом LocalDateTime #

Для создания объекта данного класса можно воспользоваться статическими методами

  • now() — получает информацию о текущем моменте времени
  • of() — создать дату из отдельных компонент, включая элементы даты и времени
  • parse() — создать дату из строкового представления

Последний метод имеет второй необязательный аргумент, формат представления даты. Если его не указать, то метод будет использовать формат даты в ISO, который также определён в константе ISO_LOCAL_DATE_TIME класса DateTimeFormatter

Если обрабатываемая строка не совпадает с переданным шаблоном, будет выброшено исключение DateTimeParseException

Вычисление относительных моментов времени #

При наличии объекта LocalDateTime можно создать новый объект, содержащий момент времени относительно текущего с помощью методов

  • minusYears, minusMonths, minusDays, minusHours, minusMinutes, minusSeconds
  • plusYears, plusMonths, plusDays, plusHours, plusMinutes, plusSeconds

Созданный объект будет отличаться от оригинального на указанное значение

Для замены какого-то элемента даты можно воспользоаться with-методами: withYears, withMonths, withDays, withHours, withMinutes, withSeconds

Сравнение дат #

Объекты класса LocalDateTime можно сравнивать друг с другом в логических выражениях, т.к. он реализует интерфейс Comparable

Также предоставляется ряд отдельных методов:

  • isAfter — проверяет если данный момент следует за моментом в аргументе
  • isBefole — проверяет если данный момент раньше момента в аргументе
  • isEqual — проверка на равенство с моментом времени в аргументе

Преобразование к строке #

Предоставляется несколько методов

  • Стандартный метод toString() — возвращает строковый литерал в одном из ISO-формате
  • Метод format(), который принимает в качестве аргумента объект класса DateTimeFormatter

Последний метод рекомендуется использовать в случае обмена данными с другими приложениями, чтобы формат данных соблюдался