Класс Java LocalDateTime

LocalDateTime — важный класс в API даты и времени, введенном в Java 8 (пакет java.time). Он представляет неизменяемый объект даты-времени без информации о часовом поясе. Этот класс может хранить информацию о дате и времени с точностью до года, месяца, дня, часа, минуты, секунды и наносекунды.

Характеристики LocalDateTime

  1. Неизменяемость: Все классы java.time неизменяемы и потокобезопасны
  2. Нет информации о часовом поясе: Представляет только локальную дату и время
  3. Точность до наносекунд: Может представлять время с точностью до наносекунд
  4. Богатый API: Предоставляет множество методов для вычислений и форматирования даты и времени

Создание объектов LocalDateTime

1. Использование статических фабричных методов

Пример

// Получить текущую дату и время
LocalDateTime now = LocalDateTime.now();

// Создать с использованием указанной даты и времени
LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 15, 14, 30, 45);

// Использование года, месяца, дня, часа, минуты
LocalDateTime dateTime1 = LocalDateTime.of(2023, Month.MAY, 15, 14, 30);

// Использование года, месяца, дня, часа, минуты, секунды
LocalDateTime dateTime2 = LocalDateTime.of(2023, 5, 15, 14, 30, 45);

// Использование года, месяца, дня, часа, минуты, секунды, наносекунды
LocalDateTime dateTime3 = LocalDateTime.of(2023, 5, 15, 14, 30, 45, 100);

2. Объединение из LocalDate и LocalTime

Пример

LocalDate date = LocalDate.of(2023, 5, 15);
LocalTime time = LocalTime.of(14, 30, 45);
LocalDateTime dateTime = LocalDateTime.of(date, time);

3. Разбор строк

Пример

LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15T14:30:45");

Общие методы операций

Получение компонентов даты и времени

Пример

LocalDateTime dateTime = LocalDateTime.now();

int year = dateTime.getYear();
Month month = dateTime.getMonth(); // Возвращает перечисление Month
int monthValue = dateTime.getMonthValue(); // Возвращает 1-12
int day = dateTime.getDayOfMonth();
int hour = dateTime.getHour();
int minute = dateTime.getMinute();
int second = dateTime.getSecond();
int nano = dateTime.getNano();

Арифметика даты и времени

Пример

LocalDateTime dateTime = LocalDateTime.now();

// Операции сложения
LocalDateTime plusYears = dateTime.plusYears(1);
LocalDateTime plusMonths = dateTime.plusMonths(1);
LocalDateTime plusDays = dateTime.plusDays(1);
LocalDateTime plusHours = dateTime.plusHours(1);
LocalDateTime plusMinutes = dateTime.plusMinutes(1);
LocalDateTime plusSeconds = dateTime.plusSeconds(1);

// Операции вычитания
LocalDateTime minusYears = dateTime.minusYears(1);
LocalDateTime minusDays = dateTime.minusDays(1);
// Другие операции вычитания аналогичны...

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

Пример

LocalDateTime dateTime1 = LocalDateTime.of(2023, 5, 15, 14, 30);
LocalDateTime dateTime2 = LocalDateTime.of(2023, 5, 16, 14, 30);

boolean isBefore = dateTime1.isBefore(dateTime2); // true
boolean isAfter = dateTime1.isAfter(dateTime2); // false
boolean isEqual = dateTime1.isEqual(dateTime2); // false

Корректировка даты и времени

Пример

LocalDateTime dateTime = LocalDateTime.now();

// Изменение конкретных полей
LocalDateTime withYear = dateTime.withYear(2024);
LocalDateTime withHour = dateTime.withHour(15);
// Остальные поля аналогичны...

// Использование TemporalAdjusters
LocalDateTime firstDayOfMonth = dateTime.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime lastDayOfYear = dateTime.with(TemporalAdjusters.lastDayOfYear());

Форматирование и парсинг

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

Пример

LocalDateTime dateTime = LocalDateTime.now();

// Использование предопределенного формата
DateTimeFormatter isoDateTime = DateTimeFormatter.ISO_DATE_TIME;
String formatted = dateTime.format(isoDateTime);

// Пользовательский формат
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String customFormatted = dateTime.format(formatter);

Разбор строки в дату-время

Пример

String str = "2023-05-15 14:30:45";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime parsedDateTime = LocalDateTime.parse(str, formatter);

Преобразования с другими классами даты и времени

Преобразование в LocalDate и LocalTime

Пример

LocalDateTime dateTime = LocalDateTime.now();

LocalDate date = dateTime.toLocalDate();
LocalTime time = dateTime.toLocalTime();

Преобразование с Instant и ZonedDateTime

Пример

// Требуется информация о часовом поясе
ZoneId zone = ZoneId.systemDefault();

// Преобразование LocalDateTime в ZonedDateTime
ZonedDateTime zonedDateTime = dateTime.atZone(zone);

// Преобразование ZonedDateTime в LocalDateTime
LocalDateTime fromZoned = zonedDateTime.toLocalDateTime();

// Преобразовать LocalDateTime в Instant
Instant instant = zonedDateTime.toInstant();

// Преобразовать Instant в LocalDateTime
LocalDateTime fromInstant = LocalDateTime.ofInstant(instant, zone);

Практические примеры применения

Вычисление интервала между двумя значениями даты и времени

Пример

LocalDateTime start = LocalDateTime.of(2023, 5, 15, 9, 0);
LocalDateTime end = LocalDateTime.of(2023, 5, 16, 17, 30);

Duration duration = Duration.between(start, end);

long hours = duration.toHours(); // 32
long minutes = duration.toMinutes(); // 1950

Проверка, входит ли дата в заданный диапазон

Пример

LocalDateTime checkDate = LocalDateTime.of(2023, 5, 15, 14, 0);
LocalDateTime startDate = LocalDateTime.of(2023, 5, 1, 0, 0);
LocalDateTime endDate = LocalDateTime.of(2023, 5, 31, 23, 59);

boolean isInRange = !checkDate.isBefore(startDate) && !checkDate.isAfter(endDate);

Генерация последовательности даты и времени

Пример

LocalDateTime start = LocalDateTime.of(2023, 5, 1, 9, 0);
List<LocalDateTime> dateTimes = new ArrayList<>();

for (int i = 0; i < 10; i++) {
    dateTimes.add(start.plusDays(i));
}

综合示例

Пример

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

public class LocalDateTimeDemo {
    public static void main(String[] args) {
        // 1. Получить текущую дату и время
        LocalDateTime now = LocalDateTime.now();
        System.out.println("Текущая дата и время: " + now);
       
        // 2. Создать конкретную дату и время
        LocalDateTime specificDateTime = LocalDateTime.of(2023, 5, 15, 10, 30, 45);
        System.out.println("Заданная дата и время: " + specificDateTime);
       
        // 3. Разобрать из строки
        LocalDateTime parsedDateTime = LocalDateTime.parse("2023-05-15T10:30:45");
        System.out.println("Дата и время после разбора: " + parsedDateTime);
       
        // 4. Форматирование вывода
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss);
        String formattedDateTime = now.format(formatter);
        System.out.println("Дата и время после форматирования: " + formattedDateTime);
       
        // 5. Получение каждого компонента
        System.out.println("Год: " + now.getYear());
        System.out.println("Месяц: " + now.getMonthValue() + " (" + now.getMonth() + ")");
        System.out.println("День: " + now.getDayOfMonth());
        System.out.println("Час: " + now.getHour());
        System.out.println("Минута: " + now.getMinute());
        System.out.println("Секунда: " + now.getSecond());
       
        // 6. Операции с датой и временем
        LocalDateTime tomorrow = now.plusDays(1);
        System.out.println("Завтра в это же время: " + tomorrow);
       
        LocalDateTime lastWeek = now.minusWeeks(1);
        System.out.println("На прошлой неделе в это же время: " + lastWeek);
       
        // 7. Сравнение даты и времени
        System.out.println("Сейчас позже указанного времени: " + now.isAfter(specificDateTime));
        System.out.println("Сейчас раньше указанного времени: " + now.isBefore(specificDateTime));
    }
}

Вывод:

格式化后的日期时间: 2025年05月01日 11:25:48
年: 2025
月: 5 (MAY)
日: 1
时: 11
分: 25
秒: 48
明天此时: 2025-05-02T11:25:48.651400
上周此时: 2025-04-24T11:25:48.651400
现在是否在特定时间之后: true
现在是否在特定时间之前: false

Преобразование даты и времени

Пример

import java.time.*;

public class DateTimeConversion {
    public static void main(String[] args) {
        // Преобразование LocalDateTime в LocalDate и LocalTime
        LocalDateTime dateTime = LocalDateTime.now();
        LocalDate date = dateTime.toLocalDate();
        LocalTime time = dateTime.toLocalTime();
       
        System.out.println("Часть даты: " + date);
        System.out.println("Часть времени: " + time);
       
        // Создание LocalDateTime из LocalDate и LocalTime
        LocalDateTime combined = LocalDateTime.of(date, time);
        System.out.println("Объединённые дата и время: " + combined);
       
        // Преобразование с Instant (требуется часовой пояс)
        ZoneId zone = ZoneId.of("Asia/Shanghai");
        Instant instant = dateTime.atZone(zone).toInstant();
        System.out.println("Преобразовано в Instant: " + instant);
    }
}

Вывод:

日期部分: 2025-05-01
时间部分: 11:27:02.724101
组合后的日期时间: 2025-05-01T11:27:02.724101
转换为Instant: 2025-05-01T03:27:02.724101Z

Итог

Класс LocalDateTime — очень практичный класс в API даты и времени Java 8. Он предоставляет богатые методы для работы с датами и временем без часовых поясов. Из этой статьи вы должны были освоить:

  1. Как создавать объекты LocalDateTime
  2. Как выполнять вычисления и сравнения даты и времени
  3. Как форматировать и разбирать дату и время
  4. Как преобразовывать в другие классы даты и времени
  5. Некоторые практические сценарии применения

LocalDateTime очень хорошо подходит для бизнес-сценариев, не требующих информации о часовом поясе, таких как дни рождения и время встреч. Для сценариев, требующих обработки часовых поясов, рассмотрите использование класса ZonedDateTime.

Статические фабричные методы

Метод Описание Пример
static LocalDateTime now() Получение текущей даты и времени LocalDateTime.now()
static LocalDateTime of(int year, int month, int day, int hour, int minute) Создание с указанием года, месяца, дня, часа, минуты LocalDateTime.of(2023, 6, 15, 14, 30)
static LocalDateTime of(int year, int month, int day, int hour, int minute, int second) Создание с указанием года, месяца, дня, часа, минуты, секунды LocalDateTime.of(2023, 6, 15, 14, 30, 45)
static LocalDateTime of(int year, Month month, int day, int hour, int minute) Создание с использованием перечисления Month LocalDateTime.of(2023, Month.JUNE, 15, 14, 30)
static LocalDateTime of(LocalDate date, LocalTime time) Создание путем объединения LocalDate и LocalTime LocalDateTime.of(LocalDate.now(), LocalTime.now())
static LocalDateTime parse(CharSequence text) Разобрать из строки (формат ISO) LocalDateTime.parse("2023-06-15T14:30:45")
static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter) Разобрать с использованием указанного формата LocalDateTime.parse("15/06/2023 14:30", DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm"))

Получение информации о дате и времени

Метод Описание Пример
int getYear() Получить год 2023
Month getMonth() Получить месяц (перечисление Month) Month.JUNE
int getMonthValue() Получить значение месяца (1-12) 6
int getDayOfMonth() Получить день месяца 15
int getDayOfYear() Получить день года 166
DayOfWeek getDayOfWeek() Получить день недели (перечисление DayOfWeek) DayOfWeek.THURSDAY
int getHour() Получить час (0-23) 14
int getMinute() Получить минуты (0-59) 30
int getSecond() Получить секунды (0-59) 45
int getNano() Получить наносекунды 0

Операции с датой и временем

Метод Описание Пример
LocalDateTime plusDays(long days) Добавить дни dt.plusDays(5)
LocalDateTime plusHours(long hours) Добавить часы dt.plusHours(2)
LocalDateTime plusMinutes(long minutes) Добавить минуты dt.plusMinutes(30)
LocalDateTime plusSeconds(long seconds) Добавить секунды dt.plusSeconds(45)
LocalDateTime plusNanos(long nanos) Добавить наносекунды dt.plusNanos(1000000)
LocalDateTime minusDays(long days) Вычесть дни dt.minusDays(5)
LocalDateTime minusHours(long hours) Вычесть часы dt.minusHours(2)
LocalDateTime minusMinutes(long minutes) Вычесть минуты dt.minusMinutes(30)
LocalDateTime minusSeconds(long seconds) Вычесть секунды dt.minusSeconds(45)
LocalDateTime minusNanos(long nanos) Вычесть наносекунды dt.minusNanos(1000000)
LocalDateTime withYear(int year) Изменить год dt.withYear(2024)
LocalDateTime withMonth(int month) Изменить месяц dt.withMonth(12)
LocalDateTime withDayOfMonth(int day) Изменить день месяца dt.withDayOfMonth(1)
LocalDateTime withHour(int hour) Изменить час dt.withHour(0)
LocalDateTime withMinute(int minute) Изменить минуту dt.withMinute(0)
LocalDateTime withSecond(int second) Изменить секунду dt.withSecond(0)
LocalDateTime withNano(int nano) Изменить наносекунду dt.withNano(0)

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

Метод Описание Пример
boolean isAfter(ChronoLocalDateTime<?> other) Проверяет, находится ли оно после указанной даты и времени dt1.isAfter(dt2)
boolean isBefore(ChronoLocalDateTime<?> other) Проверяет, находится ли оно до указанной даты и времени dt1.isBefore(dt2)
boolean isEqual(ChronoLocalDateTime<?> other) Проверяет, равно ли оно указанной дате и времени dt1.isEqual(dt2)
int compareTo(ChronoLocalDateTime<?> other) Сравнить две даты и времени dt1.compareTo(dt2)

Методы преобразования

Метод Описание Пример
LocalDate toLocalDate() Преобразовать в LocalDate dt.toLocalDate()
LocalTime toLocalTime() Преобразовать в LocalTime dt.toLocalTime()
Instant toInstant(ZoneOffset offset) Преобразовать в Instant dt.toInstant(ZoneOffset.UTC)
ZonedDateTime atZone(ZoneId zone) Преобразовать в ZonedDateTime dt.atZone(ZoneId.of("Asia/Shanghai"))
OffsetDateTime atOffset(ZoneOffset offset) Преобразовать в OffsetDateTime dt.atOffset(ZoneOffset.ofHours(8))

Форматирование и преобразование строк

Метод Описание Пример
String format(DateTimeFormatter formatter) Форматировать как строку dt.format(DateTimeFormatter.ISO_DATE_TIME)
String toString() Преобразовать в строку формата ISO "2023-06-15T14:30:45"
Другие расширения