LocalDateTime

Java 8 开始,java.time包提供了新的日期和时间 API,主要涉及的类型有:

  • 本地日期和时间:LocalDateLocalTimeLocalDateTime

  • 带时区的日期和时间:ZoneDateTime

  • 时刻:Instant

  • 时区:ZoneIdZoneOffset

  • 时间间隔:Duration

以及一套新的用于取代SimpleDateFormat的格式化类型DateTimeFormatter

和旧的 API 相比,新 API 严格区分了时刻,本地日期、本地时间和带时区的日期时间,并且对日期和时间进行运算更加方便。

此外,新 API 修改了旧 API 不合理的常量设计:

  • Monoth的范围用1~12表示1月到12月

  • week的范围用1~7表示周一到周日。

LocalDate date = LocalDate.now();    // 2025-01-20
LocalTime time = LocalTime.now();    // 11:21:40.748774
LocalDateTime dateTime = LocalDateTime.now(); // 2025-01-20T11:21:40.748785

本地日期和时间通过now()获取到的总是以当前默认时区返回的。LocalDateTimeLocalDateLocalTime默认严格按照ISO 8601规定的日期和时间格式进行打印。

LocalDateTime dateTime = LocalDateTime.now();   // 2025-01-20T11:22:35.205451
LocalDate date = dateTime.toLocalDate();        // 转换到当前日期 2025-01-20
LocalTime time = dateTime.toLocalTime();        // 转化到当前时间 11:22:35.205451

反过来,通过指定的日期和时间创建LocalDateTime可以通过of()方法:

LocalDate date = LocalDate.of(2019, 1, 1);  // 2019-01-01
LocalTime time = LocalTime.of(23, 59, 59);  // 23:59:59
LocalDateTime dateTime = LocalDateTime.of(2019, 1, 1, 23, 59, 59);  // 2019-01-01T23:59:59
LocalDateTime dt3 = LocalDateTime.of(date, time);  // 2019-01-01T23:59:59

因为严格按照ISO 8601的格式,因此,将字符串转换为LocalDateTime就可以传入标准格式:

LocalDateTime dateTime = LocalDateTime.parse("2015-05-10T06:30:00");  // 2015-05-10T06:30
LocalTime time = LocalTime.parse("06:30:00");      // 06:30
LocalDate date = LocalDate.parse("2015-05-10");    // 2015-05-10

注意ISO 8601规定的日期和时间分隔符是T。标准格式如下:

  • 日期:yyyy-MM-dd

  • 时间:HH:mm:ss

  • 带毫秒的时间:HH:mm:ss.SSS

  • 日期和时间:yyyy-MM-dd'T'HH:mm:ss

  • 带毫秒的日期和时间:yyyy-MM-dd'T'HH:mm:ss.SSS

最后更新于

这有帮助吗?