日期和时间操作
掌握 Date 和 Calendar 的基本使用
熟练使用 Java 8+ LocalDateTime 新 API
能实现日期格式化、计算、转换
核心讲解
(1)旧版 API
Date:日期时间对象,本质是时间戳SimpleDateFormat:格式化和解析日期,线程不安全Calendar:日历类,做日期计算
旧 API 设计不好,线程不安全,Java 8 + 推荐用新时间 API。
(2)Java 8 新时间 API
LocalDate:日期(年月日)LocalTime:时间(时分秒)LocalDateTime:日期 + 时间DateTimeFormatter:格式化,线程安全Period:日期间隔Duration:时间间隔
(3)常用操作
获取当前:
now()指定日期:
of()获取字段:
getYear()、getMonthValue()、getDayOfMonth()加减:
plusDays()、minusMonths()格式化:
format(格式化器)解析:
parse(字符串, 格式化器)
代码示例
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
public class DateDemo {
public static void main(String[] args) {
// ===== 1. 获取当前时间 =====
LocalDate today = LocalDate.now();
LocalDateTime now = LocalDateTime.now();
System.out.println("今天日期:" + today);
System.out.println("当前时间:" + now);
// ===== 2. 指定日期 =====
LocalDate birthday = LocalDate.of(2000, 5, 20);
System.out.println("生日:" + birthday);
// ===== 3. 获取字段 =====
System.out.println("年:" + today.getYear());
System.out.println("月:" + today.getMonthValue());
System.out.println("日:" + today.getDayOfMonth());
System.out.println("星期:" + today.getDayOfWeek());
// ===== 4. 日期计算 =====
System.out.println("7天后:" + today.plusDays(7));
System.out.println("3个月前:" + today.minusMonths(3));
// 计算两个日期相差天数
long days = ChronoUnit.DAYS.between(birthday, today);
System.out.println("出生天数:" + days);
// ===== 5. 格式化与解析 =====
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 格式化
String formatTime = now.format(formatter);
System.out.println("格式化:" + formatTime);
// 解析
String str = "2024-01-15 14:30:00";
LocalDateTime parseTime = LocalDateTime.parse(str, formatter);
System.out.println("解析后:" + parseTime);
}
}
常见误区
月份从 0 开始:旧版 Calendar 月份是 0-11,一月是 0,非常坑;新 API 月份是 1-12
SimpleDateFormat 线程安全:SimpleDateFormat 线程不安全,多线程共用会出问题,新 API 格式化器是线程安全的
格式符写错:yyyy 是年,MM 是月,dd 是日,HH 是 24 小时,hh 是 12 小时,大小写含义不同
日期计算用加减毫秒:不要自己加减毫秒,用 API 的方法,有夏令时、闰年等问题
课后练习
获取当前日期,格式化为
yyyy年MM月dd日计算你的出生日期到今天一共多少天
计算今年的国庆节是星期几
对比旧 Date 和新 LocalDateTime 的优缺点
