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_TIME
,ISO_LOCAL_DATE
,ISO_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
对象。