В Java 8 представлен новый Date Time API на основе IS0-8601 стандартов даты и времени. Date Time API использует календарную систему, определенную в ISO-8601 в качестве календаря по умолчанию. Этот календарь основан на системе Григорианского календаря. Date-Time API использует Unicode Common Locale Data Repository (CLDR) для данных локали.
Date-Time API использует базу данных часовых поясов (TZDB) для получения информации о часовом поясе.
Методы в API корректно определены в Date-Time API, обеспечивает интуитивный интерфейс, который делает код легко читаемым. Вызовы методов могут быть соединены друг с другом. Например, мы можем использовать следующий код для создания новой даты.
1 |
LocalDate allDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).minusDays(0); |
Если вывести в консоль значения переменной allDay результатом работы программы будет информация, о том какой год, какой месяц и сколько дней в месяце.
Java Date-Time API состоит в основном из неизменяемых классов. После того, как объект создан, он не может быть изменен. Для того, чтобы изменить его значение, новый объект должен быть создан в качестве модифицированной копии оригинала.
Date-Time API потокобезопасно.
Методы , используемые для создания даты или времени объекты начинаются of, from, и with , а не конструкторами. Там нет набора методов. Например:
1 |
LocalDate allDay = LocalDate.of(2016, Month.MARCH, 18); |
Java Date-Time API имеет отдельный набор классов, чтобы иметь дело с машинным временем и календарем на основе человеческого времени.
Дата-Время Пакеты
Java Date-Time API состоит из основного пакета, java.time и четырех подпакетов:
- java.time содержит ядро API для представления даты и времени. Она включает в себя классы для даты, времени, даты и времени вместе взятых, часовых поясов, моменты времени , продолжительности и часы. LocalDate, LocalTime, LocalDateTime, ZonedDateTime, период, продолжительность и мгновенные классы в этом пакете. Классы в этом пакете основаны на ISO-8601 стандартах.
- java.time.chrono содержит API для представления календаря, в отличии от того, что по умолчанию ISO-8601 в системмах. Например, Hijrah календарь, календарь ThaiBuddhist и т.д.
- java.time.format содержит классы для форматирования парсинга даты и времени.
- java.time.temporal содержит API позволяет совместимые операции между датой и временем классов, выполнения запросов и регулировки. Например, TemporalField и ChronoField и TemporalUnit и ChronoUnit.
- java.time.zone содержит классы , которые поддерживают часовых поясов, смещения от часовых поясов, а также правила часовых поясов. Например, ZonedDateTime и ZoneId или ZoneOffset.
Названия методов в Java Date-Time API выполнены в соответствии с классами.
Например, метод now(); возвращает значения даты или времени на текущий момент. from(); метод позволяет преобразование из одного класса в другой.
В следующей таблице перечислены наиболее часто используемые префиксы методов:
- of
статический метод, который позволяет создать экземпляр ANDS проверки входных параметров - from
статический метод который, преобразует входные параметры в экземпляр целевого класса. - parse
статический метод, позволяет анализировать входную строку для создания экземпляра целевого класса. - format
метод экземпляра, позволяет форматировать временный объект для получения строки. - get
метод экземпляра, возвращает часть целевого объекта. - is
метод экземпляра, запрашивает целевой объект. - with
метод экземпляра, возвращает копию целевого объекта с одним элементом изменения. - plus
метод экземпляра, возвращает копию объекта с количеством времени , с добавленнием. - minus
метод экземпляра возвращает копию объекта с количеством времени , с вычитанием. - to
метод экземпляра, преобразует этот объект в другой тип. - at
метод экземпляра, объединяет этот объект с другим объектом.
Методы of()
Java Date-Time API используются методы создания объектов.
Следующий код показывает, как создавать объекты класса LocalDate:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package test; import java.time.Clock; import java.time.LocalDate; import java.time.Month; //nookery.ru public class Test { public static void main(String[] args) { LocalDate Date1 = LocalDate.of(2016, 12, 31); System.out.println(Date1); LocalDate Date2 = LocalDate.of(2016, Month.MARCH, 18); System.out.println(Date2); LocalDate Date3 = LocalDate.ofEpochDay(2016); System.out.println(Date3); LocalDate Date4 = LocalDate.ofYearDay(2016, 31); System.out.println(Date4); } } |
Результатом работы программы будет:
2016-12-31
2016-03-18
1975-07-10
2016-01-31
Метод from()
from()статический метод, который используется для получения объекта типа DateTime , из указанного аргумента.
В отличие от of(), from() требует преобразования данных на указанный аргумент.
Следующий код показывает, как вывести LocalDate из LocalDateTime:
1 2 3 4 5 6 7 8 9 |
public class Test { public static void main(String[] args) { LocalDateTime LocDate = LocalDateTime.of(2016, 3, 18, 23, 30); System.out.println(LocDate); LocalDate Date = LocalDate.from(LocDate); System.out.println(Date); } } |
Результатом работы программы будет:2016-03-18T23:30
2016-03-18
Метод with()
Для изменения поля в объекте даты и времени мы можем использовать метод с префиксом with
with() метод возвращает копию объекта с указанным полем изменения, так как большинство объектов в Date Time API неизменны.
Следующий код показывает, как получить LocalDate из другого LocalDate с изменением года:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import java.time.LocalDate; import java.time.Month; public class Test { public static void main(String[] args) { LocalDate locDate1 = LocalDate.of(2016, Month.MARCH, 18); System.out.println(locDate1); //меняем месяц LocalDate locDate2 = locDate1.withYear(2015); System.out.println(locDate2); //меняем год и месяц LocalDate locDate3 = locDate1.withYear(2014).withMonth(10); System.out.println(locDate3); } } |
Результатом выполнения программы будет:
2016-03-18
2015-03-18
2014-10-18
Метод get()
get()возвращает указанный элемент объекта.
Следующий код показывает , как получить год, месяц, день от LocalDate объекта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//nookery.ru import java.time.LocalDate; import java.time.Month; public class Test { public static void main(String[] args) { LocalDate locDate = LocalDate.of(2018, 03, 19); int year = locDate.getYear(); System.out.println(year); Month month = locDate.getMonth(); System.out.println(month); int day = locDate.getDayOfMonth(); System.out.println(day); } } |
Результатом работы программы будет:
2018
MARCH
19
Метод to()
to() преобразует объект в соответствующий тип.
Следующий код показывает некоторые примеры использования метода to().
1 2 3 4 5 6 7 8 9 10 11 |
//nookery.ru import java.time.LocalDate; public class Test { public static void main(String[] args) { LocalDate locDate = LocalDate.of(2016, 3, 18); long days = locDate.toEpochDay(); System.out.println(days); } } |
Результатом работы программы будет: 16878
Метод at()
at() создает новый объект даты и времени из существующего объекта даты и времени с дополнительной информацией.
Рассмотрим следующий пример использования кода в методе, чтобы добавить дополнительную информацию для объекта даты.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//nookery.ru import java.time.LocalDate; import java.time.LocalDateTime; public class Test { public static void main(String[] args) { LocalDate locDate = LocalDate.of(2016, 3, 18); System.out.println(locDate); LocalDateTime locTime = locDate.atStartOfDay(); System.out.println(locTime); LocalDateTime locTime2 = locDate.atTime(10, 20); System.out.println(locTime2); } } |
Результатом работы программу будет:
2016-03-18
2016-03-18T00:00
2016-03-18T10:20
Метод plus()
plus() возвращает копию объекта путем добавления заданного значения.
Следующий код показывает, как использовать метод плюс, чтобы добавить больше времени для локального объекта даты.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//nookery.ru import java.time.LocalDate; public class Test { public static void main(String[] args) { LocalDate locDate = LocalDate.of(2018, 3, 18); LocalDate locDate1 = locDate.plusDays(7); System.out.println(locDate1); LocalDate locDate2 = locDate.plusMonths(2); System.out.println(locDate2); LocalDate locDate3 = locDate.plusWeeks(4); System.out.println(locDate3); } } |
Результатом работы программы будет:
2018-03-25
2018-05-18
2018-04-15
Метод minus()
minus() возвращает копию объекта путем вычитания заданного значения.
Следующий код показывает, как вычесть время из локального объекта даты.
1 2 3 4 5 6 7 8 9 10 11 12 |
//nookery.ru import java.time.LocalDate; public class Test { public static void main(String[] args) { LocalDate locDate = LocalDate.of(2018, 3, 18); LocalDate locDate1 = locDate.minusMonths(4); System.out.println(locDate1); LocalDate locDate2 = locDate.minusWeeks(5); System.out.println(locDate2); } } |
Результатом работы такой программы будет:
2017-11-18
2018-02-11
Метод now()
now() метод возвращает текущее время для различых классов, например LocalDate, LocalTime, LocalDateTime, ZonedDateTime .
Следующий код показывает, как использовать метод now() для возврата текущей даты и времени.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//nookery.ru import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZonedDateTime; public class Test { public static void main(String[] args) { LocalDate locDate = LocalDate.now(); System.out.println(locDate); LocalTime locTime = LocalTime.now(); System.out.println(locTime); LocalDateTime locDateTime = LocalDateTime.now(); System.out.println(locDateTime); ZonedDateTime ZDateTime = ZonedDateTime.now(); System.out.println(ZDateTime); } } |
Результатом работы программы будет:
2016-03-19
08:20:47.061
2016-03-19T08:20:47.061
2016-03-19T08:20:47.071+04:00[Europe/Moscow]