Java 8 引入了全新的日期和时间 API,这个 API 在 java.time 包中。这个 API 的设计目标是更加直观,更加易于使用,同时也包含了更丰富的功能。以下是主要的一些类。

1.LocalDate:这是一个纯日期,没有时间的部分。比如你可以用它来表示一个特定的日子,如 2014-01-14

2.LocalTime:这是一个纯时间,没有日期的部分。比如你可以用它来表示一天中的一个特定时间,如 13:45:20

3.LocalDateTime:这是日期和时间的组合。它既有日期部分,也有时间部分,但是没有时区。

4.ZonedDateTime:这是最完整的日期时间,它包含了日期、时间、时区以及与格林威治或 UTC 的时差。

5.Instant:这是一个时间戳,表示从1970年1月1日(UTC)开始的秒数。

6.Duration:这是两个瞬时时间点之间的时间段,以秒和纳秒为单位。

7.Period:这是两个日期之间的时间段,以年、月和日为单位。

8.ZoneId 和 ZoneOffset:这两个类用于处理时区。

9.DateTimeFormatter:这个类用于日期和时间的格式化和解析。

这些类都是不可变且线程安全的,可以放心使用。

一、支持格式化选项

Java 8 的日期和时间 API 提供了 DateTimeFormatter 类,用于格式化和解析日期和时间。以下是一些主要的格式化选项:

  • 预定义的格式DateTimeFormatter 类提供了一些预定义的格式,例如 ISO_LOCAL_DATE_TIMEISO_LOCAL_DATEISO_LOCAL_TIME 等。
// 获取当前的日期时间
        LocalDateTime now = LocalDateTime.now();

        // 使用 ISO_LOCAL_DATE_TIME 格式
        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        String formattedDateTime = now.format(formatter);
        System.out.println(formattedDateTime);  // 输出类似 "2024-01-08T13:18:19.456"

        // 使用 ISO_LOCAL_DATE 格式
        formatter = DateTimeFormatter.ISO_LOCAL_DATE;
        formattedDateTime = now.format(formatter);
        System.out.println(formattedDateTime);  // 输出类似 "2024-01-08"

        // 使用 ISO_LOCAL_TIME 格式
        formatter = DateTimeFormatter.ISO_LOCAL_TIME;
        formattedDateTime = now.format(formatter);
        System.out.println(formattedDateTime);  // 输出类似 "13:18:19.456"
  • 自定义的格式:你可以使用 ofPattern 方法创建自定义的格式。例如,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") 会创建一个可以将日期时间格式化为 2021-12-31 23:59:59 这样的格式。
// 获取当前的日期时间
        LocalDateTime now = LocalDateTime.now();

        // 创建一个自定义的格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 使用 formatter 来格式化 LocalDateTime 对象
        String formattedDateTime = now.format(formatter);
        System.out.println(formattedDateTime);  // 输出类似 "2024-01-08 13:18:19"
  • 区域设置:你可以使用 withLocale 方法为 DateTimeFormatter 设置区域设置。这会影响到如何格式化和解析日期和时间。例如,美国和欧洲的日期格式是不同的。
// 获取当前的日期时间
        LocalDateTime now = LocalDateTime.now();

        // 创建一个自定义的格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd HH:mm:ss");

        // 使用美国的区域设置来格式化 LocalDateTime 对象
        formatter = formatter.withLocale(Locale.US);
        String formattedDateTime = now.format(formatter);
        System.out.println(formattedDateTime);  // 输出类似 "2024-Jan-08 13:18:19"

        // 使用法国的区域设置来格式化 LocalDateTime 对象
        formatter = formatter.withLocale(Locale.FRANCE);
        formattedDateTime = now.format(formatter);
        System.out.println(formattedDateTime);  // 输出类似 "2024-janv.-08 13:18:19"
  • 格式化:你可以使用 DateTimeFormatter 的 format 方法将日期时间对象格式化为字符串。
// 获取当前的日期时间
        LocalDateTime now = LocalDateTime.now();

        // 创建一个自定义的格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 使用 formatter 来格式化 LocalDateTime 对象
        String formattedDateTime = now.format(formatter);
        System.out.println(formattedDateTime);  // 输出类似 "2024-01-08 13:18:19"
  • 解析:你可以使用 DateTimeFormatter 的 parse 方法将字符串解析为日期时间对象。
// 创建一个自定义的格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 使用 formatter 来解析一个日期时间字符串
        String dateTimeString = "2024-01-08 13:18:19";
        LocalDateTime parsedDateTime = LocalDateTime.parse(dateTimeString, formatter);
        System.out.println(parsedDateTime);  // 输出类似 "2024-01-08T13:18:19"

二、格式转换

1.Date转换为LocalDate

LocalDate localDate = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

 我们首先创建了一个 Date 对象,然后将它转换为 Instant 对象,接着将 Instant 对象转换为 ZonedDateTime 对象,最后从 ZonedDateTime 对象获取了 LocalDate 对象。

2.LocalDate转换为Date

// 创建一个 LocalDate 对象
        LocalDate localDate = LocalDate.now();
        // 将 LocalDate 转换为 Date
        Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

我们首先创建了一个 LocalDate 对象,然后将它转换为 LocalDateTime 对象,接着将 LocalDateTime 对象转换为 ZonedDateTime 对象,然后将 ZonedDateTime 对象转换为 Instant 对象,最后将 Instant 对象转换为 Date 对象。