Java 8 API для работы с датами и временем

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Java 8 представила новый API для работы с датой и временем, вдохновлённый библиотекой JodaTime. Он устраняет недостатки существующего API для работы с датой. В этом практическом занятии мы узнаем, как использовать новый API для работы с датой и временем для манипулирования датами и временами.

Создание экземпляров LocalDate

Класс LocalDate используется для представления даты в стандартном ISO-формате (гггг-мм-дд). Он не включает время и не поддерживает временные зоны.

Мы можем создать экземпляр класса LocalDate, используя метод now(). Он будет захватывать текущую дату в соответствии с системным часовым.

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currentDate = LocalDate.now();
        System.out.println("Current Date: " + currentDate);
    }
}

Сохраните и выполните код с использованием следующей команды:

javac DateTimeExample.java && java DateTimeExample

Мы увидим следующий вывод:

Current Date: 2021-08-13

Парсинг строки с датой

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

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        String str = "2021-08-13";
        LocalDate date = LocalDate.parse(str);
        System.out.println("Date: " + date);
    }
}

Сохраните и выполните код с использованием следующей команды:

javac DateTimeExample.java && java DateTimeExample

Мы увидим следующий вывод:

Date: 2021-08-13

Методы plus и minus

Мы можем добавить или вычесть дни, месяцы или годы из даты, используя метод plusDays() или minusDays(). Также есть аналогичные методы для изменения месяцев и лет.

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        LocalDate yesterday = currDate.minusDays(1);
        LocalDate tomorrow = currDate.plusDays(1);

        System.out.println("Current Date: " + currDate);
        System.out.println("Tomorrow's Date: " + tomorrow);
        System.out.println("Yesterday's Date: " + yesterday);
    }
}

Сохраните и выполните код с использованием следующей команды:

javac DateTimeExample.java && java DateTimeExample

Мы увидим следующий вывод:

Current Date: 2021-08-13
Tomorrow's Date: 2021-08-14
Yesterday's Date: 2021-08-12

Методы доступа

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

import java.time.DayOfWeek;
import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        DayOfWeek dayOfWeek = currDate.getDayOfWeek();
        int dayOfMonth = currDate.getDayOfMonth();
        int dayOfYear = currDate.getDayOfYear();

        System.out.println("Date: " + currDate);
        System.out.println("Day of Week: " + dayOfWeek);
        System.out.println("Day of Month: " + dayOfMonth);
        System.out.println("Day of Year: " + dayOfYear);
    }
}

Сохраните и выполните код с использованием следующей команды:

javac DateTimeExample.java && java DateTimeExample

Мы увидим следующий вывод:

Date: 2021-08-13
Day of Week: ПЯТНИЦА
Day of Month: 13
Day of Year: 225

Сравнение дат

Мы можем сравнивать даты, используя методы isBefore() и isAfter(), чтобы проверить, какая из них больше.

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        LocalDate tomorrow = currDate.plusDays(1);
        LocalDate yesterday = currDate.minusDays(1);

        System.out.println("Текущая дата позже даты вчера: " + currDate.isAfter(yesterday));
        System.out.println("Текущая дата раньше даты завтра: " + currDate.isBefore(tomorrow));
    }
}

Сохраните и выполните код с использованием следующей команды:

javac DateTimeExample.java && java DateTimeExample

Мы увидим следующий вывод:

Текущая дата позже даты вчера: true
Текущая дата раньше даты завтра: true

Создание экземпляров LocalTime

Для создания экземпляра LocalTime мы можем использовать методы now(), of() или parse(). Метод now() будет использовать системный часы для получения текущего времени. Методы of() и parse() могут создать LocalTime в соответствии с переданными параметрами.

import java.time.LocalTime;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalTime currentTime = LocalTime.now();
        LocalTime t1 = LocalTime.of(5, 32, 44);
        LocalTime t2 = LocalTime.parse("05:32:44");

        System.out.println(currentTime);
        System.out.println(t1);
        System.out.println(t2);
    }
}

Сохраните и выполните код с использованием следующей команды:

javac DateTimeExample.java && java DateTimeExample

Мы увидим следующий вывод:

17:43:08.749240
05:32:44
05:32:44

Методы plus и minus

Мы можем использовать методы plus() и minus() для манипуляций с экземплярами LocalTime.

import java.time.LocalTime;
import java.time.temporal.ChronoUnit;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalTime t1 = LocalTime.of(5, 32, 44);
        LocalTime t2 = t1.plus(2, ChronoUnit.HOURS);
        LocalTime t3 = t1.minusMinutes(10);

        System.out.println(t1);
        System.out.println(t2);
        System.out.println(t3);
    }
}

Сохраните и выполните код с использованием следующей команды:

javac DateTimeExample.java && java DateTimeExample

Мы увидим следующий вывод:

05:32:44
07:32:44
05:22:44

Создание экземпляров LocalDateTime

Класс LocalDateTime является комбинацией классов LocalDate и LocalTime. Экземпляр LocalDateTime содержит компонент даты и компонент времени.

import java.time.LocalDateTime;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDateTime currDateTime = LocalDateTime.now();
        LocalDateTime dt1 = LocalDateTime.of(2020, 8, 13, 5, 32);
        LocalDateTime dt2 = LocalDateTime.parse("2020-08-13T05:32");

        System.out.println(currDateTime);
        System.out.println(dt1);
        System.out.println(dt2);
    }
}

Сохраните и выполните код с использованием следующей команды:

javac DateTimeExample.java && java DateTimeExample

Мы увидим следующий вывод:

2021-08-13T17:46:48.837697
2020-08-13T05:32
2020-08-13T05:32

Работа с временными зонами

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

import java.time.ZonedDateTime;
import java.time.ZoneId;

public class DateTimeExample {
    public static void main(String[] args) {
        ZonedDateTime zdt = ZonedDateTime.now();
        ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo");
        ZonedDateTime zdtT = ZonedDateTime.now(zoneTokyo);
        ZoneId zoneLondon = ZoneId.of("Europe/London");
        ZonedDateTime zdtL = ZonedDateTime.now(zoneLondon);

        System.out.println(zdt);
        System.out.println(zdtT);
        System.out.println(zdtL);
    }
}

Сохраните и выполните код с использованием следующей команды:

javac DateTimeExample.java && java DateTimeExample

Мы увидим следующий вывод:

2021-08-13T18:09:25.352237+05:30[Asia/Calcutta]
2021-08-13T21:39:25.356244+09:00[Asia/Tokyo]
2021-08-13T13:09:25.357316+01:00[Europe/London]

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

Java 8 предоставляет функцию format(), чтобы отформатировать дату в строку с использованием определенного шаблона.

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();
        String dateStr1 = dateTime.format(DateTimeFormatter.ISO_WEEK_DATE);
        String dateStr2 = dateTime.format(DateTimeFormatter.BASIC_ISO_DATE);
        String dateStr3 = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        String dateStr4 = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm:ss"));

        System.out.println(dateStr1);
        System.out.println(dateStr2);
        System.out.println(dateStr3);
        System.out.println(dateStr4);
    }
}

Сохраните и выполните код с использованием следующей команды:

javac DateTimeExample.java && java DateTimeExample

Мы увидим следующий вывод:

2021-W32-5
20210813
2021-08-13T18:16:57.675704
13/08/2021 06:16:57

Резюме

В этом практическом занятии мы узнали, как использовать API для работы с датами и временем в Java 8. Мы узнали, как создавать экземпляры классов LocalDate, LocalTime и LocalDateTime, манипулировать ими с помощью методов plus() и minus() и получать информацию из них с помощью методов-геттеров. Кроме того, мы узнали, как работать с временными зонами с использованием класса ZonedDateTime и форматировать даты с использованием класса DateTimeFormatter.