Java 日期与时间(java.time)
Java 8 引入了新的日期时间 API(java.time 包),解决了旧 API 的问题,提供了更好的日期时间处理能力。理解新的日期时间 API 是进行时间相关开发的基础。本章将详细介绍 Java 中的日期时间处理。
java.time 包概览
为什么需要新的日期时间 API?
旧 API(java.util.Date、Calendar)的问题:
- 线程不安全
- API 设计混乱
- 时区处理复杂
- 可变对象,容易出错
新 API(java.time)的优势:
- 线程安全(不可变对象)
- API 设计清晰
- 时区处理简单
- 不可变对象,更安全
LocalDate 类
LocalDate 表示日期(年-月-日),不包含时间。
import java.time.LocalDate;
// 获取当前日期
LocalDate today = LocalDate.now();
System.out.println("今天:" + today); // 2024-01-15
// 创建指定日期
LocalDate date1 = LocalDate.of(2024, 1, 15);
LocalDate date2 = LocalDate.of(2024, Month.JANUARY, 15);
// 从字符串解析
LocalDate date3 = LocalDate.parse("2024-01-15");
// 获取日期组成部分
int year = today.getYear(); // 2024
int month = today.getMonthValue(); // 1
int day = today.getDayOfMonth(); // 15
DayOfWeek dayOfWeek = today.getDayOfWeek(); // MONDAY
LocalTime 类
LocalTime 表示时间(时:分:秒),不包含日期。
import java.time.LocalTime;
// 获取当前时间
LocalTime now = LocalTime.now();
System.out.println("现在:" + now); // 14:30:45.123
// 创建指定时间
LocalTime time1 = LocalTime.of(14, 30);
LocalTime time2 = LocalTime.of(14, 30, 45);
LocalTime time3 = LocalTime.of(14, 30, 45, 123456789);
// 从字符串解析
LocalTime time4 = LocalTime.parse("14:30:45");
// 获取时间组成部分
int hour = now.getHour(); // 14
int minute = now.getMinute(); // 30
int second = now.getSecond(); // 45
LocalDateTime 类
LocalDateTime 表示日期和时间,不包含时区。
import java.time.LocalDateTime;
// 获取当前日期时间
LocalDateTime now = LocalDateTime.now();
System.out.println("现在:" + now); // 2024-01-15T14:30:45.123
// 创建指定日期时间
LocalDateTime dt1 = LocalDateTime.of(2024, 1, 15, 14, 30);
LocalDateTime dt2 = LocalDateTime.of(2024, Month.JANUARY, 15, 14, 30, 45);
// 从 LocalDate 和 LocalTime 组合
LocalDate date = LocalDate.of(2024, 1, 15);
LocalTime time = LocalTime.of(14, 30);
LocalDateTime dt3 = LocalDateTime.of(date, time);
// 从字符串解析
LocalDateTime dt4 = LocalDateTime.parse("2024-01-15T14:30:45");
日期/时间解析与格式化
DateTimeFormatter 类
DateTimeFormatter 用于格式化和解析日期时间。
import java.time.format.DateTimeFormatter;
// 格式化
LocalDate date = LocalDate.of(2024, 1, 15);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formatted = date.format(formatter); // "2024-01-15"
// 解析
LocalDate parsed = LocalDate.parse("2024-01-15", formatter);
// 预定义格式
DateTimeFormatter isoDate = DateTimeFormatter.ISO_DATE;
String formatted2 = date.format(isoDate); // "2024-01-15"
常用格式模式
LocalDateTime now = LocalDateTime.now();
// 自定义格式
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted1 = now.format(formatter1); // "2024-01-15 14:30:45"
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分");
String formatted2 = now.format(formatter2); // "2024年01月15日 14时30分"
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String formatted3 = now.format(formatter3); // "15/01/2024"
格式模式符号
| 符号 | 含义 | 示例 |
|---|---|---|
| y | 年 | 2024 |
| M | 月 | 1, 01, Jan, January |
| d | 日 | 1, 01 |
| H | 时(24小时制) | 0-23 |
| h | 时(12小时制) | 1-12 |
| m | 分 | 0-59 |
| s | 秒 | 0-59 |
| a | AM/PM | AM, PM |