Работа с датами и временем — распространенная задача в мире разработки программного обеспечения. При создании финансового приложения или платформы электронной коммерции или просто при необходимости записи временных меток необходимость в простом в использовании API даты и времени имеет решающее значение. В Java 8 в пакете java.time появился мощный API даты/времени для обработки операций, связанных с датой и временем. В этой статье мы рассмотрим API даты/времени Java 8 и раскроем его замечательные возможности.

Класс LocalDate

Класс LocalDate представляет дату без часового пояса в формате гггг-мм-дд.

Экземпляр текущей даты можно создать с помощью метода LocalDate.now().

LocalDate today = LocalDate.now();   // 2023-08-28

Используя метод of или parse, мы можем создать экземпляр LocalDate для определенной даты.

LocalDate localDate = LocalDate.of(2023, 08, 31);  // 2023-08-31

LocalDate localDate = LocalDate.parse("2023-09-20"); // 2023-09-20

Мы можем добавлять/вычитать дни, месяцы и годы из экземпляра LocalDate.

LocalDate yesterday = LocalDate.now().plusDays(1);     // 2023-08-27
LocalDate tomorrow  = LocalDate.now().minusDays(1);    // 2023-08-29

LocalDate lastMonth = LocalDate.now().minusMonths(1);  //2023-07-28
LocalDate nextMonth = LocalDate.now().plusMonths(1);   //2023-09-28

LocalDate lastYear  = LocalDate.now().minusYears(1);  //2022-08-28
LocalDate nextYear  = LocalDate.now().plusYears(1);   //2024-08-28

Мы можем получить день недели, день, месяц и год из экземпляра LocalDate.

DayOfWeek day = LocalDate.now().getDayOfWeek();   //MONDAY


int day     = LocalDate.parse("2023-01-12").getDayOfMonth();   // 12
Month month = LocalDate.parse("2023-01-12").getMonth();        // JANUARY
int year    = LocalDate.parse("2023-01-12").getYear();         // 2023

Мы можем проверить, является ли конкретный год високосным, выполнив следующие действия.

boolean isLeap  = LocalDate.now().isLeapYear();                 //false
boolean isLeap1 = LocalDate.parse("2024-01-12").isLeapYear();   //true

Сравнение двух дат можно сделать следующим образом.

// create local dates
LocalDate date1 = LocalDate.parse("2022-08-12");
LocalDate date2 = LocalDate.parse("2023-01-09");

// check if date1 is before date2
boolean isBefore = date1.isBefore(date2);   //true

// check if date1 is after date2
boolean isAfter = date1.isAfter(date2);     //false

Класс локального времени

Класс LocalTime представляет время без даты.

Экземпляр текущего времени можно создать с помощью метода LocalTime.now().

LocalTime now = LocalTime.now();       // 14:07:12.503202341 

Используя метод of или parse, мы можем создать экземпляр LocalTime для определенного времени.

LocalTime eightFifteen = LocalTime.parse("08:15");  // 08:15
LocalTime eightFifty   = LocalTime.of(8, 50);       // 08:50

Подобно LocalDate, мы можем добавлять или вычитать минуты, секунды и часы из экземпляра LocalTime.

LocalTime timeInOneHour   = LocalTime.now().plus(1, ChronoUnit.HOURS);  //15:16:05.836826479 
LocalTime timeInOneMinute = LocalTime.now().plusMinutes(1);             //14:17:05.836826479

Мы можем получить секунды, минуты и часы из конкретного экземпляра LocalTime.

//Local Time : 14:21:22.383214776

int hour = LocalTime.now().getHour();        //14
int minutes = LocalTime.now().getMinute();   //21
int seconds = LocalTime.now().getSecond();`  //22

Мы можем сравнить два раза следующим образом.

LocalTime time1 = LocalTime.parse("02:23");
LocalTime time2 = LocalTime.parse("23:13");

// check if time1 is before time2
boolean isBefore = time1.isBefore(time2);   // true

// check if time1 is after time2
boolean isAfter = time1.isAfter(time2);    // false

Класс LocalDateTime

Класс LocalDateTime используется для представления даты и времени без часового пояса.

Для этого класса также можно выполнять аналогичные операции, такие как LocalDate и LocalTime.

//Get the current date and time

LocalDateTime now = LocalDateTime.now(); //2023-08-28T14:31:21.433439004

//Create an instance using of and parse

LocalDateTime parseDateTime = LocalDateTime.parse("2023-09-29T15:20");  //2023-09-29T15:20

LocalDateTime givenDateTime = LocalDateTime.of(2023, Month.SEPTEMBER, 4, 02, 02); //2023-09-04T02:02

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

LocalDateTime yesterday         = LocalDateTime.now().plusDays(1);
LocalDateTime timebeforeOneHour = LocalDateTime.now().minusHours(1);

Мы можем получить конкретный день, месяц, год, секунду, минуту, час из экземпляра класса LocalDateTime.

 //LocalDateTime : 2023-08-28T14:40:11.302826996

int hour     = LocalDateTime.now().getHour();          // 14
int minutes  = LocalDateTime.now().getMinute();        // 40
int seconds  = LocalDateTime.now().getSecond();        // 11
            
int day      = LocalDateTime.now().getDayOfMonth();    // 28
Month month  = LocalDateTime.now().getMonth();         // AUGUST
int year     = LocalDateTime.now().getYear();          // 2023

Мы также можем сравнить два экземпляра LocalDateTime, используя методы isAfter и isBefore.

Класс ZonedDateTime

ZonedDateTime предоставляется Java8 для обработки дат и времени, зависящих от часового пояса.

Мы можем получить доступные ZoneIds следующим образом.

Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();

Идентификаторы зон могут быть такими: Азия/Аден, Америка/Куяба и т. д.

Мы можем преобразовать LocalDateTime в определенную зону.

LocalDateTime now = LocalDateTime.now(); //2023-08-28T15:00:30.487070279

ZonedDateTime zonedDT = ZonedDateTime.of(now, ZoneId.of("Africa/Nairobi"));  //2023-08-28T15:00:30.487070279+03:00[Africa/Nairobi]

ZonedDateTime также предоставляет метод parse для получения даты и времени для конкретного часового пояса.

ZonedDateTime zonedDT = ZonedDateTime.parse("2019-12-20T10:15:30+05:00[Asia/Karachi]");

Подобно ранее упомянутым классам, мы можем выполнять операции плюс/минус, получать разные единицы времени и даты, а также сравнивать два экземпляра, используя класс ZonedDateTime.

Класс периода

Класс Period используется для изменения значений заданной даты и получения разницы между заданным классом.

Следующий код иллюстрирует, как можно манипулировать экземпляром LocalDate:

// Current Local Date : 2023-08-28

// Add a period of 6 days
LocalDate futureDate = LocalDate.now().plus(Period.ofDays(6));  // 2023-09-03

// Subtract a period of 2 weeeks
LocalDate pastDate = LocalDate.now().minus(Period.ofWeeks(2));  //2023-08-14

// Add period of 2 months and 15 days
LocalDate specificDate = LocalDate.now().plus(Period.ofMonths(2).plusDays(15)); //2023-11-12

Мы можем получить разницу между двумя датами в разных единицах даты, используя класс Period.

LocalDate date1 = LocalDate.of(2022, Month.AUGUST, 12);   // 2022-08-12
LocalDate date2 = LocalDate.of(2023, Month.DECEMBER, 02); // 2023-12-02

// Difference between two dates
Period period = Period.between(date1, date2);    //P1Y3M20D


int days = period.getDays();       // 20
int months = period.getMonths();   // 3
int years = period.getYears();     // 1
boolean isNegative = period.isNegative(); // false
boolean isZero = period.isZero();         // false

P1Y3M20D представляет собой Период, составляющий 1 годгод, 3месяца и 20дней.

Мы можем использовать класс ChronoUnit для получения разницы между двумя датами в определенной единице измерения, например дне, месяце или году.

long days = ChronoUnit.DAYS.between(date1, date2);     // 477
long months = ChronoUnit.MONTHS.between(date1, date2); // 15
long years = ChronoUnit.YEARS.between(date1, date2);   // 1

Класс продолжительности

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

// Current Local Time: 15:39:40.053910730

// Add a duration of 8 hours
LocalTime futureTime = LocalTime.now().plus(Duration.ofHours(8));  //23:39:40.063033292

// Subtract 1 day
LocalTime pastTime = LocalTime.now().minus(Duration.ofDays(1));   //15:39:40.063269984

// Add 4 Days and 3 hours
LocalTime specificTime = LocalTime.now().plus(Duration.ofDays(4).plusHours(3)); //15:39:40.063269984

Мы можем получить продолжительность между двумя заданными моментами времени следующим образом.

LocalTime time1   = LocalTime.of(10, 30); // 10:30
LocalTime time2   = LocalTime.of(12, 28); // 12:28

// get the difference between times
Duration duration = Duration.between(time1, time2);  //PT1H58M

long seconds = duration.getSeconds(); // 7080
long minutes = duration.toMinutes();  // 118
long hours = duration.toHours();      // 1

Мы можем использовать класс ChronoUnit для получения разницы между двумя значениями времени в определенных единицах измерения, например секундах, минутах или часах.

long seconds = ChronoUnit.SECONDS.between(time1, time2); // 7080
long minutes = ChronoUnit.MINUTES.between(time1, time2); // 118
long hours   = ChronoUnit.HOURS.between(time1, time2); // 1

Временные регуляторы

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

LocalDate givenDate= LocalDate.parse("2023-08-28")

givenDate.with(TemporalAdjusters.lastDayOfMonth()) //2023-08-31
givenDate.with(TemporalAdjusters.firstDayOfMonth()) //2023-08-01
givenDate.with(TemporalAdjusters.firstDayOfNextMonth()) //2023-09-01

Некоторые из других Настройщиков Времени:

  • следующий(ДеньНедели.ВТОРНИК)
  • деньНеделиВМесяце
  • первыйденьследующий год
  • первыйдень года
  • LastDayOfNextMonth
  • LastDayOfNextYear
  • последний день дня года

Краткое содержание

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

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

Приятного кодирования!

Рекомендации