Java 日期时间
程序常要获取当前时间、格式化显示、解析字符串或做日期加减。Java 先后提供 Date、Calendar 与 Java 8 的 java.time 三套日期 API,本节介绍用法与取舍。
Date 类与缺陷
java.util.Date 表示一个时间点,内部存毫秒数。缺陷:月份从 0 开始(1 月是 0),对格式化、日期加减支持差,大量方法已废弃。
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
Date d = new Date(); // 当前时间点
System.out.println(d); // 输出示例:Sat Nov 16 10:20:30 CST 2024
System.out.println(d.getTime()); // 输出示例:1731723630000(毫秒)
}
}
Date 之外还有一个全局时间戳:System.currentTimeMillis() 返回 1970-01-01 00:00:00 UTC 至今的毫秒数,常用于计时与排序,用两次数值相减即可得到耗时。
Calendar 使用
Calendar 是抽象类,用 getInstance() 获取实例,可获取、设置、加减日期字段。注意月份仍从 0 开始,取月要加 1。
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
System.out.println(c.get(Calendar.YEAR)); // 输出示例:2024
System.out.println(c.get(Calendar.MONTH) + 1); // 输出示例:11
c.add(Calendar.DAY_OF_MONTH, 7); // 加 7 天,跨月自动进位
c.set(Calendar.YEAR, 2030); // 设置年份
}
}
SimpleDateFormat 格式化与解析
用模式字母描述格式:format 把 Date 变成字符串,parse 把字符串解析成 Date。常用模式字母表:
| 字母 | 含义 | 示例 |
|---|---|---|
| y | 年 | 2024 |
| M | 月 | 11 或 Nov |
| d | 日 | 16 |
| H | 24 小时制小时 | 13 |
| h | 12 小时制小时 | 01 |
| m | 分钟 | 05 |
| s | 秒 | 09 |
| E | 星期几 | 周六 / Sat |
| a | 上午 / 下午 | 上午 |
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormatDemo {
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date())); // 输出示例:2024-11-16 10:20:30
sdf.parse("2024-01-01 08:30:00"); // 字符串解析成 Date
}
}
注意区分大小写:MM 是月、mm 是分钟、HH 是 24 小时制、hh 是 12 小时制。SimpleDateFormat 非线程安全,不要当作静态共享字段。
java.time 新 API 简介
Java 8 起推荐 java.time:月份 1~12、类不可变且线程安全。LocalDate 只管日期,LocalDateTime 日期带时间,Instant 是时间戳,DateTimeFormatter 负责格式化。
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class TimeNewDemo {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println(today.plusDays(1)); // 输出示例:明天
LocalDateTime dt = LocalDateTime.now();
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm");
System.out.println(dt.format(fmt)); // 输出示例:2024年11月16日 10:20
}
}
时区注意
Date 与 Instant 本质是 UTC 时间点,打印时按 JVM 默认时区转成本地时间;跨时区业务应显式用 ZoneId / ZonedDateTime 处理,不要自己拼字符串。
小结:新项目优先 java.time 的 LocalDate / LocalDateTime + DateTimeFormatter;SimpleDateFormat 要注意模式字母大小写且线程不安全,Date 与 Calendar 已过时。