+38 (097) 099-97-97 JAVA ТРЕНИНГИ
JAVA ТРЕНИНГИ

Введение в работу с датой и временем в Java 8. Начальный уровень.

Эта статья предназначена для начинающих разработчиков, желающих познакомиться и использовать в своей работе новые возможности работы с датой и временем, которые появились в JDK 8.

Введение в работу с датой и временем в Java 8

Рассматриваемые темы:

  • Немного о времени
  • Создание объектов даты и времени
  • Операции с датой и временем
  • Работа с периодами
  • Форматироване даты и времени
  • Получение даты и время из строки

Немного о времени

Можно выделить 2 взгляда на время: с абсолютной и относительной точек зрения.
Строка:3 Столбец:4
Абсолютное время не связано не с какими временными интервалами связанными с наблюдателем и по хорошему не имеет начала и конца.
Но в библиотеке java.time, прототип которой создал мастер Joda (шутка), у нас абсолютное время имеет начало и конец, но по прежнему не привязано к временным промежуткам.
Можно считать что абсолютное время — это набор секунд, которые осчитываются с момента начала времён и до мемента их окончания. Мы находимся где то на этой шкале.
В компьютерном мире началом времён считают наиболее яркое событие в мире компьютеров — рожедение мессии операционной системы Unix, прородителя Linux и MacOS.
Так же в компьютерном мире единицей измерения берут не секунду и микросекунду, а в java.time API единицей измерения является наносекунда.
В отличии от предыдущих подходов работы с временем все классы пакета java.time являются неизменяемыми, соответственно потокобезопасными.
Так же нововведением является то, что номера месяцев начинаются с 1.

Относительная точка зрения на время уже связывается с наблюдателем живущим на нашей планете. В связи с этим появляются понятия местного времени, которое уже начинает быть связано с планетой земля и для него становятся уже важны промежутки времени, характерные для нашей планеты. Здесь можно выделить несколько основных промежутков.

Количество секунд, за которое земля совершает оборот вокруг своей оси и оно равно 24 часа Х 60 минут Х 60 секунд = 86400 секунд.
Количество секунд, проходящих между двумя последовательными одинаковыми фазами Луны, относительно наблюдателя с земли.
Количество секунд, проходящих между двумя последовательными прохождениями Солнцем точки весеннего равноденствия, опять же относительно наблюдателя с земли.

Абсолютное время представлено java.time классами Instant и Duration
Относительное или местное время представлено тремя основными классами LocalDateTime, ZonedDateTime и Period
Так же местное время дополняется такими классами и перечислениями как LocalTime, LocalDate, MonthDay, Year,YearMo<tr><td>m</td><td>минута одноцифровая</td></tr>nth, Month, DayOfWeek а часовые пояса представлены классами ZoneId и ZoneOffset
Так же у нас в распоряжении есть удобный интерфейс для выравнивания дат TemporalAdjuster.
Класс ChronoUnit позволяет измерять промежутки времени и задавать единицы измерения для этих промежутков.
Класс Clock используется для тестовых нужд.

Давайте теперь рассмотрим варианты создания классов LocalDate, LocalTime и LocalDateTime. Все три класса не содержат часовых поясов и сам Оракл рекомендует использовать часовые пояса только там, где это действительно нужно.
Все объекты создаются с помощью статических методов генерации о которых подробнее можно почитать тут
Попытка создания объекта с помощью конструктора приведёт к ошибке компиляции

LocalDate date = new LocalDate(); // Ошибка
LocalDate date = LocalDate.now(); // Правильное создание

Создание объекта даты

Создать объекты с текущей датой и/или временем можно с момощью статического метода генерации now()

Так же можно создать объект с задваемыми значениями даты/времени. Зделать это можно с помощью статического метода генерации of().

При создании даты, можно использовать один из статических методов генерации

public static LocalDate of(int year, int month, int dayOfMonth)
public static LocalDate of(int year, Month month, int dayOfMonth)

Создание объекта времени

Время представлено классом LocalTime и содеожит 3 статических метода генерации для задания объекта времени с параметрами

public static LocalTime of(int hour, int minute)
public static LocalTime of(int hour, int minute, int second)
public static LocalTime of(int hour, int minute, int second, int nanos)

Создание объекта даты и времени

Тут много разных генерирующих методов

public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute)
public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)
public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanos)
public static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute)
public static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second)
public static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second, int nanos)
public static LocalDateTime of(LocalDate date, LocalTime)
Тут можно запомнить следующим образом
Вот примеры

LocalDateTime dateTime1 = LocalDateTime.of(2017, Month.JANUARY, 15, 12, 10, 45);
LocalDateTime dateTime2 = LocalDateTime.of(date1, time1);

Заканчивая говорить о создании объектов даты/времени, вспомним как создвавались эти объекты раньше.
Для создания текущей даты/времени использовался класс Date.

Для задания конкретных значений для даты/времени использовался класс GregorianCalendar реализатор интерфейса Calendar

Операции с датой и временем

Самые основные операции — это сложение и вычитание дат или времени.

Для этих задач есть широкий набор методов, для объектов разных классов набор методов разный, давайте рассмотрим методы класса LocalDateTime.

LocalDateTime minusYears(long years) // Минус указанное количество лет
LocalDateTime minusMonths(long months) // Минус указанное количество месяцев
LocalDateTime minusWeeks(long weeks) // Минус указанное количество недель
LocalDateTime minusDays(long days) // Минус указанное количество дней
LocalDateTime minusHours(long hours) // Минус указанное количество часов
LocalDateTime minusMinutes(long minutes) // Минус указанное количество минут
LocalDateTime minusSeconds(long seconds) // Минус указанное количество секунд
LocalDateTime minusNanos(long nanos) // Минус указанное количество наносекунд
LocalDateTime plusYears(long years) // Плюс указанное количество лет
LocalDateTime plusMonths(long months) // Плюс указанное количество месяцев
LocalDateTime plusWeeks(long weeks) // Плюс указанное количество недель
LocalDateTime plusDays(long days) // Плюс указанное количество дней
LocalDateTime plusHours(long hours) // Плюс указанное количество часов
LocalDateTime plusMinutes(long minutes) // Плюс указанное количество минут
LocalDateTime plusSeconds(long seconds) // Плюс указанное количество секунд
LocalDateTime plusNanos(long nanos) // Плюс указанное количество наносекунд

Вот пример использования

Так же операции сложения и вычитания можно применять к результату выполнения предыдущей оперции (шаблон Builer).

Но если не сохранять результат выполнения (новый, порождённый операцией, объект), то эффекта от выполнения операций не будет.

зачем
Тут конечно нужно понимать что методы изменения даты будут применимы к объекту LocalDate и LocalDateTime, методы изменения времени будут применимы к объектам LocalTime и LocalDateTime.

Операции с периодами

Задаётся классом Period.
Вообще разницу между двумя моментами времени можно задать с помощью промежутка времени или периода.
Период может задаваться в днях, неделях, месяцах, годах. Так же задать перид смешанным образом.

При работе с периодами нельзя делать цепочки вызовов по шаблону Buider.
Подобная запись будет не верной.

Можно задавать разницу времени, с помощью длительности — класс Duration.
Длительность можно задавать в днях, часах, минутах, секундах, наносекундах.

Периоды можно применять к объектам даты но НЕ времени.

Применение периода ко времени даст ошибку

Форматироване даты и времени

Форматирование выполняется с помощью класса DateTimeFormatter.

Так как существует стандарт ISO форматирования даты и времени, класс DateTimeFormatter поддерживает этот стандарт.
Форматирование выполняется с помощью соотвествующих констант у класса: ISO_LOCAL_DATE, ISO_LOCAL_TIME, ISO_LOCAL_DATE_TIME

вывод будет следующий

Есть ещё две «нестандартные» константы: SHORT, MEDIUM.
Т.к. класс DateTimeFormatter универсален в том плане что используется для форматирования любых объектов даты/времени, то использование констант сокращённого формата выполняется в связке с порождающими методами:

  1. ofLocalizedDate
  2. ofLocalizedTime
  3. ofLocalizedDateTime

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

Логику использования форматирования для разных объектов можно представить в виде вот такой таблицы

localDate localTime localDateTime
ofLocalizedDate Можно Ошибка Можно
ofLocalizedDateTime Ошибка Ошибка Можно
ofLocalizedTime Ошибка Можно Можно

Если вам не подходят предустановленные форматы, то можно использовать свой собственный, для этого используется метод DateTimeFormatter.ofPattern
Форматирование выполняется с помощью шаблона, задаваемого по стандартным правилам. Шаблон состоит из частей, каждая составная шаблона имеет определённое значение.
Вот пример использования:

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

Описание элемента Значение
M месяц одноцифровой без начального нуля, к примеру 1
MM месяц, к примеру 12
MMM месяц, к примеру Jan
MMMM месяц, к примеру January
d день одноцифровой без начального нуля, к примеру 2
dd день, к примеру 02
yy год двухцифровой, к примеру 17
yyyy год четырёхцифровой, к примеру 2017
h час одноцифровой, к примеру 7
hh час двухцифровой, к примеру 07
:.;, Возможные разделители, можно любые символы
m минута одноцифровая, к примеру 6
mm минута двухцифровая, к примеру 50

Получение даты и время из строки

Рад ответить на ваши вопросы, пожалуйста задавайте их в комментариях в статье.

× Ваш комментарий будет опубликован после модерации Спасибо!
× Слишком много комментариев за короткий период времени Пожалуйста, попробуйте позже
контакты

Записаться на ближайший тренинг можно с помощью формы.

отправить
Курсы java Киев, Курсы по программированию на Java Киеве
Показать сообщение про успешную отправку
Спасибо за заявку!
Заполните форму и мы вам перезвоним
отправить
Заполните форму и начните учить Java правильно
Выберите курс
записаться
jon.com.ua