Java 日期和时间处理入门
日期和时间处理是任何应用程序开发中的关键任务之一。无论是事件日志记录、交货期限计算、日程安排还是数据分析——不理解 Java 如何管理时间对象都是不行的。在本文中,我们将介绍所有主要方面:从旧的 API(Date 和 Calendar)到现代的 java.time 包(Java 8+)。您将学习如何创建、格式化、比较和计算日期之间的差异。
1. 旧 API:Date 和 Calendar
在 Java 8 之前,用于处理日期的主要类是 java.util.Date 和 java.util.Calendar。它们在遗留代码中仍然很常见,因此了解它们的基本功能和局限性非常重要。
1.1 Date 类
Date 表示一个精确到毫秒的特定时间点。然而,它有很多缺点:它是可变的(在多线程应用程序中不安全),并且对国际化的支持很差。
import java.util.Date;
public class DateExample { public static void main(String[] args) { // 当前日期和时间 Date now = new Date(); System.out.println("当前日期: " + now);
// 获取年份的过时方法 (1900 + ...) int year = now.getYear() + 1900; System.out.println("年份: " + year); }}1.2 Calendar 类
Calendar 是一个更灵活但更繁琐的类。它允许操作日期的各个组成部分(年、月、日)。
import java.util.Calendar;
public class CalendarExample { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); System.out.println("当前时间: " + cal.getTime());
// 设置特定日期 cal.set(2025, Calendar.MARCH, 15); System.out.println("设置的日期: " + cal.getTime());
// 增加 7 天 cal.add(Calendar.DAY_OF_MONTH, 7); System.out.println("一周后: " + cal.getTime()); }}缺点:月份从 0 开始编号(一月 = 0),可变性,缺乏简单的格式化。
2. 新 API:java.time (Java 8+)
从 Java 8 开始,标准库中添加了 java.time 包,它基于 Joda-Time 库的思想。它由不可变(immutable)类组成,使代码安全且可预测。
2.1 LocalDate — 仅日期
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 specificDate = LocalDate.of(2025, Month.DECEMBER, 31); System.out.println("新年: " + specificDate);
// 增加/减少天数 LocalDate nextWeek = today.plusDays(7); System.out.println("一周后: " + nextWeek); }}2.2 LocalTime — 仅时间
LocalTime 存储时间(小时、分钟、秒、纳秒),不关联日期。
import java.time.LocalTime;
public class LocalTimeExample { public static void main(String[] args) { LocalTime now = LocalTime.now(); System.out.println("当前时间: " + now);
LocalTime meeting = LocalTime.of(14, 30); System.out.println("会议时间: " + meeting);
// 比较时间 if (now.isAfter(meeting)) { System.out.println("会议已经结束"); } }}<