Skip to content

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 一句话带过DateCalendarSimpleDateFormat 都是老大难(可变、线程不安全、月份从 0 开始),新代码一律不用,遇到老代码知道它们存在即可。LocalDateTime 是 Spring Boot + MyBatis 项目的标准字段类型。