Полное руководство по Java 8 Date Time API. Примеры LocalDate, Instant, LocalDateTime, Parse и Format

Полное руководство по Java 8 Date Time API. Примеры LocalDate, Instant, LocalDateTime, Parse и Format

С самых первых версий в Java не было единого и удобного подхода для работы с датой и временем, поэтому новый Date/Time API является одним из самых нужных и важных нововведений в Java 8. В этой статье мы на примерах рассмотрим все самые главные нововведения для работы с датой и временем.

Что нам дает новый Java Date Time API?

Прежде чем мы начнем разбираться с новым Java 8 Date Time API, давайте рассмотрим главные проблемы в работе с датой и временем версий Java 7 и ниже:

  1. Классы Java Date Time раскиданы по пакетам. Так, класс Date Class есть как в пакете java.util, так и в java.sql пакете. Классы для форматирования и парсинга определены в java.text пакете.
  2. Пакет java.util.Date содержит как дату, так и время, в то время как java.sql.Date содержит только дату. По моему, оба класса не очень хорошо спроектированы.
  3. Все классы для работы с датой могут изменяться, поэтому они не потокобезопасны. Это одна из самых больших проблем в Date и Calendar классах.
  4. Класс Date не обеспечивает интернационализацию, не поддерживает часовые пояса. Поэтому были введены классы java.util.Calendar и java.util.TimeZone, но опять-таки, они имеют все перечисленные выше проблемы.

Ввиду всех перечисленных выше недостатков сторонними разработчиками была создана библиотека для работы с датой и временем. Она называется Joda Time и очень часто используется в качестве замены стандартным Java классам. Но это тема уже другой статьи.

Разбор Java 8 Date Time API

Java 8 Date Time API предназначена заменить старые классы для работы со временем и датой. Давайте рассмотрим основные пакеты нового API.

  1. Пакет java.time — Это базовый пакет нового Date Time API. Все основные базовые классы являются частью этого пакета: LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration и другие. Все эти классы являются неизменными и потокобезопасными. В большинстве случаев, этих классов будет достаточно для большинства задач.
  2. Пакет java.time.chrono — пакет с общими интерфейсами для не календарных систем ISO. Мы можем наследовать класс AbstractChronology для создания собственной календарной системы.
  3. Пакет java.time.format — пакет с классами форматирования и парсинга времени и даты. В большинстве случаев, мы не будем использовать их напрямую, потому что классы в пакете java.time предоставляют удобные методы для форматирования и парсинга.
  4. Пакет java.time.temporal используется для работы с временными объектами, например, с помощью него мы можем узнать первый или последний день месяца. Методы таких классов сразу заметны на фоне других, потому что всегда имеют формат ‘withXXX‘.
  5. Пакет java.time.zone — классы для поддержки различных часовых поясов и правила их изменения.

Примеры использования Java Date Time API

Мы уже рассмотрели наиболее важные части Java Date Time API. Пришло время разобраться с классами и и посмотреть их в работе на небольших примерах.

Класс java.time.LocalDate

java.time.LocalDate — неизменяемый класс, который представляет объекты Date в формате по умолчанию yyyy-MM-dd. Мы можем использовать метод now(), чтобы получить текущую дату. Мы также можем предоставить в качестве аргументов год, месяц и день, чтобы создать экземпляр LocalDate. Этот класс предоставляет перегруженный метод now(), которому мы можем предоставить ZoneId для получения даты в конкретном часовом поясе. Этот класс предоставляет такую ​​же функциональность как java.sql.Date. Давайте посмотрим на простой пример для его использования:

Результат выполнения приведенной выше программы:

Класс java.time.LocalTime

Класс LocalTime является неизменяемым и представляет собой время в читабельном виде. По умолчанию он предоставляет формат hh:mm:ss.zzz. Так же, как и LocalDate, этот класс обеспечивает поддержку часовых поясов и создание даты, передавая в качестве аргументов часы, минуты и секунды. Давайте посмотрим использование LocalTime на примере простой программы:

Результат выполнения приведенной выше программы:

Пример использования java.time.LocalDateTime

Класс java.time.LocalDateTime — представляет собой дату и время в формате по умолчанию: yyyy-MM-dd-HH-mm-ss.zzz. Чтобы создать экземпляр LocalDateTime есть метод, который принимает LocalDate и LocalTime в качестве входных аргументов. Давайте посмотрим его использование на простом примере:

Результат выполнения:

Пример использования java.time.Instant

Класс Instant используется для работы с машиночитаемым форматом времени — он сохраняет дату и время в так называемый «unix timestamp (отметку времени)». Пример использования ниже:

Результат:

Пример использования вспомогательных методов Date API

Как упоминалось ранее, работу большинства классов с датой и временем в Java 8 обеспечивают различные вспомогательные методы: прибавить или отнять несколько дней, недель, месяцев и т.д. Есть и другие методы для управления датой с помощью TemporalAdjuster и расчета разницы между двумя датами. Смотрим пример использования вспомогательных методов в Java 8 Date API:

Результат выполнения:

Пример парсинга и форматирование даты

Давайте посмотрим пример парсинга и форматирования даты:

Вот результат:

Вот и все нововведения в Date Time API Java 8. Из всего вышеперечисленного можно смело делать вывод, что API удался: стал намного удобнее и понятнее. Я думаю, что с таким Date Time API многие откажутся от использование сторонних библиотек для работы со временем и датой.

Посмотреть краткий обзор нововведений в Java 8 можно здесь. А подробные руководство по основным API Java 8 вы найдете в этом разделе.

2 Комментарии “Полное руководство по Java 8 Date Time API. Примеры LocalDate, Instant, LocalDateTime, Parse и Format

  1. Тут ошибка:
    //Сравниваем два LocalDate: до и после
    System.out.println(«Сегодня — это полсе 02.03.2017? : » + today.isBefore(LocalDate.of(2017,3,2)));

    Должно быть:
    //Сравниваем два LocalDate: до и после
    System.out.println(«Сегодня — это до 02.03.2017? : » + today.isBefore(LocalDate.of(2017,3,2)));

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *