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。常用模式字母表:

字母含义示例
y2024
M11 或 Nov
d16
H24 小时制小时13
h12 小时制小时01
m分钟05
s09
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 已过时。

笔记加载中…