Класс Java LocalDateTime
LocalDateTime — важный класс в API даты и времени, введенном в Java 8 (пакет java.time). Он представляет неизменяемый объект даты-времени без информации о часовом поясе. Этот класс может хранить информацию о дате и времени с точностью до года, месяца, дня, часа, минуты, секунды и наносекунды.
Характеристики LocalDateTime
- Неизменяемость: Все классы java.time неизменяемы и потокобезопасны
- Нет информации о часовом поясе: Представляет только локальную дату и время
- Точность до наносекунд: Может представлять время с точностью до наносекунд
- Богатый 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);
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);
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();
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 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 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 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);
// Использование предопределенного формата
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);
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();
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);
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 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 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));
}
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));
}
}
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);
}
}
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. Он предоставляет богатые методы для работы с датами и временем без часовых поясов. Из этой статьи вы должны были освоить:
- Как создавать объекты LocalDateTime
- Как выполнять вычисления и сравнения даты и времени
- Как форматировать и разбирать дату и время
- Как преобразовывать в другие классы даты и времени
- Некоторые практические сценарии применения
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" |