LocalDateTime详解
LocalDateTime 是 Java 8 引入的日期时间 API 中的一个重要类,LocalDateTime 是一个不可变的日期-时间对象,表示日期-时间,通常被视为年-月-日-时-分-秒。它可以存储从公元前 999,999,999 年到公元 999,999,999 年之间的所有日期和时间。
1. 创建和获取LocalDateTime实例
1.1 静态工厂方法
-
now()
: 获取当前日期和时间LocalDateTime now = LocalDateTime.now();
-
of(int year, Month month, int dayOfMonth, int hour, int minute)
: 使用指定的年、月、日、小时和分钟创建实例LocalDateTime dt = LocalDateTime.of(2023, Month.MAY, 15, 10, 30);
-
parse(CharSequence text)
: 从字符串解析LocalDateTimeLocalDateTime dt = LocalDateTime.parse("2023-05-15T10:30:00");
1.2 从其他时间对象创建
-
ofInstant(Instant instant, ZoneId zone)
: 从Instant和ZoneId创建LocalDateTime dt = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
-
of(LocalDate date, LocalTime time)
: 从LocalDate和LocalTime创建LocalDateTime dt = LocalDateTime.of(LocalDate.now(), LocalTime.now());
2. 获取LocalDateTime的组成部分
getYear()
: 获取年份getMonth()
: 获取月份(返回Month枚举)getMonthValue()
: 获取月份的数值(1-12)getDayOfMonth()
: 获取月份中的日(1-31)getDayOfYear()
: 获取年份中的日(1-366)getDayOfWeek()
: 获取星期几(返回DayOfWeek枚举)getHour()
: 获取小时(0-23)getMinute()
: 获取分钟(0-59)getSecond()
: 获取秒(0-59)getNano()
: 获取纳秒(0-999,999,999)
LocalDateTime dt = LocalDateTime.now();
int year = dt.getYear();
Month month = dt.getMonth();
int dayOfMonth = dt.getDayOfMonth();
DayOfWeek dayOfWeek = dt.getDayOfWeek();
int hour = dt.getHour();
int minute = dt.getMinute();
3. 修改LocalDateTime
由于LocalDateTime是不可变的,所有修改操作都返回新实例。
3.1 加减操作
plusYears(long years)
: 加年plusMonths(long months)
: 加月plusWeeks(long weeks)
: 加周plusDays(long days)
: 加天plusHours(long hours)
: 加小时plusMinutes(long minutes)
: 加分钟plusSeconds(long seconds)
: 加秒plusNanos(long nanos)
: 加纳秒
对应的还有minus方法:
minusYears()
, minusMonths()
, minusWeeks()
, minusDays()
, minusHours()
, minusMinutes()
, minusSeconds()
, minusNanos()
LocalDateTime newDt = dt.plusDays(1).minusHours(2);
3.2 设置特定字段
withYear(int year)
: 设置年withMonth(int month)
: 设置月withDayOfMonth(int dayOfMonth)
: 设置月中的日withDayOfYear(int dayOfYear)
: 设置年中的日withHour(int hour)
: 设置小时withMinute(int minute)
: 设置分钟withSecond(int second)
: 设置秒withNano(int nanoOfSecond)
: 设置纳秒
LocalDateTime newDt = dt.withYear(2024).withMonth(6).withDayOfMonth(1);
4. 比较LocalDateTime
isAfter(ChronoLocalDateTime<?> other)
: 判断是否在指定日期时间之后isBefore(ChronoLocalDateTime<?> other)
: 判断是否在指定日期时间之前isEqual(ChronoLocalDateTime<?> other)
: 判断是否与指定日期时间相等compareTo(ChronoLocalDateTime<?> other)
: 比较两个日期时间
boolean isAfter = dt1.isAfter(dt2);
boolean isBefore = dt1.isBefore(dt2);
boolean isEqual = dt1.isEqual(dt2);
int comparisonResult = dt1.compareTo(dt2);
5. 格式化和解析
format(DateTimeFormatter formatter)
: 使用指定的格式化器格式化日期时间parse(CharSequence text, DateTimeFormatter formatter)
: 使用指定的格式化器解析字符串
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = dt.format(formatter);
LocalDateTime parsed = LocalDateTime.parse("2023-05-15 10:30:00", formatter);
6. 转换为其他类型
toLocalDate()
: 转换为LocalDatetoLocalTime()
: 转换为LocalTimeatZone(ZoneId zone)
: 转换为ZonedDateTimeatOffset(ZoneOffset offset)
: 转换为OffsetDateTime
LocalDate date = dt.toLocalDate();
LocalTime time = dt.toLocalTime();
ZonedDateTime zdt = dt.atZone(ZoneId.of("Europe/Paris"));
OffsetDateTime odt = dt.atOffset(ZoneOffset.UTC);
7. 查询和调整器方法
query(TemporalQuery<R> query)
: 使用指定的查询器查询此日期时间with(TemporalAdjuster adjuster)
: 使用指定的调整器调整此日期时间
LocalDateTime firstDayOfMonth = dt.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime lastDayOfYear = dt.with(TemporalAdjusters.lastDayOfYear());
8. 其他实用方法
truncatedTo(TemporalUnit unit)
: 截断到指定的时间单位until(Temporal endExclusive, TemporalUnit unit)
: 计算到另一个时间的时间量toEpochSecond(ZoneOffset offset)
: 转换为1970-01-01T00:00:00Z的秒数
LocalDateTime truncated = dt.truncatedTo(ChronoUnit.HOURS);
long hours = dt.until(anotherDt, ChronoUnit.HOURS);
long epochSecond = dt.toEpochSecond(ZoneOffset.UTC);
9. 计算时间差
LocalDateTime dateTime1 = LocalDateTime.of(2023, 1, 1, 0, 0);
LocalDateTime dateTime2 = LocalDateTime.of(2023, 12, 31, 23, 59);
Duration duration = Duration.between(dateTime1, dateTime2);
long days = duration.toDays();
long hours = duration.toHours();
10. 与 java.util.Date 和 java.sql.Timestamp 的转换
10.1 LocalDateTime 转 Date
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
10.2 Date 转 LocalDateTime
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
10.3 LocalDateTime 转 Timestamp
Timestamp timestamp = Timestamp.valueOf(localDateTime);
10.4 Timestamp 转 LocalDateTime
LocalDateTime localDateTime = timestamp.toLocalDateTime();