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): 从字符串解析LocalDateTime

    LocalDateTime 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(): 转换为LocalDate
  • toLocalTime(): 转换为LocalTime
  • atZone(ZoneId zone): 转换为ZonedDateTime
  • atOffset(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();
  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值