💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
为了方便你记忆和查阅,我将 Java 8 的时间工具类(`java.time` 包)按照**核心类型**、**计算工具**、**格式化工具**三个维度进行了汇总: ### Java 8 时间工具类全汇总表 | 分类 | 类名 | 作用描述 | 常用示例 / 方法 | | --- | --- | --- | --- | | **核心日期时间** | **`LocalDate`** | **纯日期**(年-月-日) | `LocalDate.now()`, `of(2023, 10, 1)` | | | **`LocalTime`** | **纯时间**(时:分:秒:纳秒) | `LocalTime.now()`, `of(13, 45, 20)` | | | **`LocalDateTime`** | **日期+时间**(最常用) | `LocalDateTime.now()`, `of(...)` | | | **`ZonedDateTime`** | **带时区的日期时间** | `ZonedDateTime.now(ZoneId.of("Asia/Shanghai"))` | | | **`Instant`** | **时间戳**(UTC 瞬时点) | `Instant.now()`, `toEpochMilli()` | | **间隔与计算** | **`Duration`** | 计算 **时间** 间隔(秒/纳秒级) | `Duration.between(time1, time2)` | | | **`Period`** | 计算 **日期** 间隔(年/月/日级) | `Period.between(date1, date2)` | | | **`ChronoUnit`** | 通用的时间单位枚举 | `ChronoUnit.DAYS.between(start, end)` | | **转换与调节** | **`DateTimeFormatter`** | **格式化与解析**(线程安全) | `ofPattern("yyyy-MM-dd")`, `format()`, `parse()` | | | **`TemporalAdjusters`** | **时间调节器**(复杂计算) | `firstDayOfMonth()`, `lastDayOfYear()` | | | **`ZoneId`** | **时区标识** | `ZoneId.systemDefault()`, `ZoneId.of("UTC+8")` | --- ### 🚀 常用场景代码速查 #### 1. 格式化日期 (代替旧的 SimpleDateFormat) ```java // 定义格式 (建议定义为 static final 常量,因为它是线程安全的) DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 日期转字符串 String nowStr = LocalDateTime.now().format(df); // 字符串转日期 LocalDateTime dateTime = LocalDateTime.parse("2023-12-01 10:00:00", df); ``` #### 2. 计算两个日期相差的天数 ```java LocalDate start = LocalDate.of(2023, 1, 1); LocalDate end = LocalDate.now(); // 方式一:使用 Period (侧重于年月日差额) long days = Period.between(start, end).getDays(); // 方式二:使用 ChronoUnit (侧重于总天数,最常用) long totalDays = ChronoUnit.DAYS.between(start, end); ``` #### 3. 获取特定日期 (月初、月末、下周五) ```java LocalDate today = LocalDate.now(); // 本月第一天 LocalDate firstDay = today.with(TemporalAdjusters.firstDayOfMonth()); // 本月最后一天 LocalDate lastDay = today.with(TemporalAdjusters.lastDayOfMonth()); // 下个周一 LocalDate nextMonday = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); ``` --- ### 💡 核心知识点(面试/开发常考) 1. **不可变性 (Immutable)**:所有类都是不可变的。如果你执行 `date.plusDays(1)`,原来的 `date` 对象不会变,必须用 `date = date.plusDays(1)` 来接收新对象。 2. **线程安全**:旧版 `SimpleDateFormat` 线程不安全,而 `DateTimeFormatter` 是线程安全的,可以在多线程环境下放心使用。 3. **无偏移量问题**:旧版 `Date` 年份从 1900 开始,月份从 0 开始。Java 8 修正了这一点:2023年就是 2023,10月就是 10。 这套 API 是目前 Java 开发的标准。