Работа с датами и временем в JVM
#
Васильев Андрей Михайлович, 2025
Версии презентации
Даты и время — это сложно
#
В повседневной жизни даты кажутся достаточно простыми, всегда можно договориться
о встрече в 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
Последний метод рекомендуется использовать в случае обмена данными с другими
приложениями, чтобы формат данных соблюдался