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