Java 中处理日期与时间的入门指南
处理日期和时间是开发中最常见的任务之一。无论是事件记录、期限计算、数据过滤还是日历显示——都离不开对时间 API 的熟练掌握。在 Java 中,java.util.Date 和 java.util.Calendar 类曾长期被使用,但它们存在许多缺陷:可变性、非直观的 API、线程安全问题。
从 Java 8 开始,语言中新增了基于 ISO-8601 标准的 java.time 包。它提供了不可变且线程安全的类,使用起来更加方便。在本文中,我们将涵盖新旧两种方法,并展示实际代码示例。
1. 遗留类:Date 和 Calendar
尽管不建议在新项目中使用 Date 和 Calendar,但在遗留代码中仍可能遇到它们。让我们看一下主要要点。
java.util.Date 类
Date 类表示一个特定的时间点,精度为毫秒。它有许多已弃用的方法。
import java.util.Date;
public class DateExample { public static void main(String[] args) { // 当前日期和时间 Date now = new Date(); System.out.println("当前时间: " + now);
// 带毫秒的构造方法(自1970年1月1日起) Date specificDate = new Date(1000000000000L); System.out.println("日期: " + specificDate);
// 比较日期 boolean after = now.after(specificDate); System.out.println("now 是否晚于 specificDate? " + after); }}java.util.Calendar 类
Calendar 是一个更灵活,但操作日期仍不方便的类。
import java.util.Calendar;
public class CalendarExample { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // 设置特定日期 cal.set(2025, Calendar.MARCH, 15, 10, 30, 0); System.out.println("设置日期: " + cal.getTime());
// 获取单个字段 int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; // 月份从0开始 int day = cal.get(Calendar.DAY_OF_MONTH); System.out.println("年: " + year + ", 月: " + month + ", 日: " + day);
// 添加天数 cal.add(Calendar.DAY_OF_MONTH, 10); System.out.println("10天后: " + cal.getTime()); }}缺点: 可变性(方法会修改对象本身)、处理时区复杂、月份索引易混淆。
2. 现代 API:java.time(Java 8+)
java.time 包解决了旧类的所有问题。主要类:
- LocalDate —— 不含时间的日期(年、月、日);
- LocalTime —— 不含日期的时间(时、分、秒、纳秒);
- LocalDateTime —— 不含时区的日期和时间;
- ZonedDateTime —— 带时区的日期和时间;
- Instant —— UTC 时间点;
- Duration 和 Period —— 用于处理时间间隔。
LocalDate —— 处理日期
import java.time.LocalDate;import java.time.Month;
public class LocalDateExample { public static void main(String[] args) { // 当前日期 LocalDate today = LocalDate.now(); System.out.println("今天: " + today);
// 特定日期 LocalDate specific = LocalDate.of(2025, Month.DECEMBER, 25); System.out.println("圣诞节: " + specific);
// 添加天数 LocalDate nextWeek = to