在 Java 中处理日期和时间,您可以使用 Java 8 引入的新的日期时间 API,也被称为 JSR-310,位于 java.time
包中。这个新的 API 解决了旧的 java.util.Date
类和 java.util.Calendar
类的线程安全和设计问题,并提供了一组丰富的工具用于日期和时间的操作。以下是 java.time
包的一些关键类及其用途:
1. LocalDate
代表一个不可变的日期,例如 2014-03-11
,它是默认格式 yyyy-MM-dd
。它不包含时间或时区信息。
示例:
LocalDate now = LocalDate.now(); // 获取今天的日期
LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1); // 创建特定的日期
2. LocalTime
代表一个不可变的时间,如 10:15
。它不包括日期或时区信息。
示例:
LocalTime now = LocalTime.now(); // 获取当前时间
LocalTime bedtime = LocalTime.of(22, 30); // 创建特定的时间
3. LocalDateTime
结合了 LocalDate
和 LocalTime
,代表一个不带时区的日期和时间。
示例:
LocalDateTime now = LocalDateTime.now(); // 获取当前日期和时间
LocalDateTime event = LocalDateTime.of(2014, Month.MARCH, 11, 10, 30); // 创建特定的日期和时间
4. ZonedDateTime
LocalDateTime
的带时区版。它完全由 ISO-8601 日历系统定义,并且的确处理了时区的问题。
示例:
ZonedDateTime nowInParis = ZonedDateTime.now(ZoneId.of("Europe/Paris")); // 获取巴黎时区的当前日期和时间
5. DateTimeFormatter
用于日期和时间的格式化和解析。
示例:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String formattedDate = now.format(formatter); // 格式化日期
LocalDate parsedDate = LocalDate.parse("2023/04/04", formatter); // 解析日期字符串
6. Instant
代表一个特定的时刻,可以精确到纳秒。通常用于时间戳的表示。
示例:
Instant now = Instant.now(); // 获取当前时刻
7. Period
和 Duration
Period
用于处理两个日期之间的周期,而 Duration
用于处理两个时间之间的持续时间。
示例:
Period tenDays = Period.between(startDate, endDate); // 计算两个日期之间的周期
Duration threeMinutes = Duration.ofMinutes(3); // 创建持续时间
8. TemporalAdjusters
提供了一系列实用的预定义调整器,例如找到下一个星期天、第一个星期一等。
示例:
LocalDate nextTuesday = today.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)); // 获取下一个星期二的日期
新的 java.time
包易于理解和使用,提供了一致的API,从而大大简化了日期和时间的处理。这些类是不可变的并且是线程安全的,这意味着它们可以在并发环境中被重用而不需要额外的同步或防御性拷贝。