Appearance
2026-08-27 · 日期操作一律用 java.time——LocalDateTime 和 DateTimeFormatter 就够了。
Java 日期与时间
1. 核心类:LocalDateTime
存"日期 + 时间",不可变、线程安全:
java
import java.time.LocalDateTime;
import java.time.LocalDate;
import java.time.LocalTime;
LocalDateTime now = LocalDateTime.now(); // 2026-08-27T20:30:45.123
LocalDateTime fixed = LocalDateTime.of(2026, 8, 27, 20, 30); // 指定时间
// 只取日期 / 只取时间(数据库日期字段常用)
LocalDate today = LocalDate.now(); // 2026-08-27
LocalTime time = LocalTime.now(); // 20:30:45常用计算:
java
now.plusDays(7); // 7 天后
now.minusHours(2); // 2 小时前
now.getYear(); // 2026
now.getMonthValue(); // 8(月份从 1 开始,没有坑)
now.isAfter(other); // 比较2. 格式化:DateTimeFormatter
java
import java.time.format.DateTimeFormatter;
LocalDateTime now = LocalDateTime.now();
// 格式化(日期 → 字符串)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String text = now.format(formatter); // "2026-08-27 20:30:45"
// 解析(字符串 → 日期)
LocalDateTime parsed = LocalDateTime.parse("2026-08-27 20:30:45", formatter);
// DateTimeFormatter 线程安全,可以定义为 static final 常量
static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");忘记格式时:
yyyy年、MM月、dd日、HH时、mm分、ss秒。
3. 与时间戳互转
java
// LocalDateTime → 时间戳(毫秒)
long timestamp = now.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
// 时间戳 → LocalDateTime
LocalDateTime fromTimestamp = LocalDateTime.ofInstant(
Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());4. Spring Boot 里的实际用法
java
// 实体类:数据库 datetime 字段直接映射 LocalDateTime
@Data
public class User {
private Long id;
private String name;
private LocalDateTime createTime; // 用 LocalDateTime,不用 Date
}
// 输出格式化
String createTime = user.getCreateTime().format(FORMATTER);旧 API 一句话带过:
Date、Calendar、SimpleDateFormat都是老大难(可变、线程不安全、月份从 0 开始),新代码一律不用,遇到老代码知道它们存在即可。LocalDateTime是 Spring Boot + MyBatis 项目的标准字段类型。