Java 日期与时间处理完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Java中处理日期和时间入门

处理日期和时间是应用程序开发中最常见的任务之一。Java为此提供了强大的工具。长期以来,主要使用java.util.Date类,但它存在严重缺陷:可变性、月份混乱(从0开始)以及缺乏时区支持。随着Java 8的发布,情况发生了巨大变化——出现了新的Date/Time API(java.time包),它是线程安全、不可变且直观的。本文将涵盖这两种方法,但主要重点将放在现代API上。



1. 遗留API:Date和Calendar

虽然不建议在新代码中使用旧类,但您在遗留项目中可能会遇到它们。让我们看看主要要点。



Date类

java.util.Date类表示一个具有毫秒精度的特定时间点。它有许多已弃用的方法。

import java.util.Date;

public class LegacyDateExample { 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);

// 比较日期 Date earlier = new Date(0); boolean isBefore = earlier.before(now); // true System.out.println("更早吗? " + isBefore); }}


Calendar类

java.util.Calendar是一个更灵活但笨重的工具。它允许操作日期字段。

import java.util.Calendar;

public class CalendarExample { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // 设置特定日期:2024年12月25日 10:30:00 cal.set(2024, Calendar.DECEMBER, 25, 10, 30, 0); System.out.println("日期: " + cal.getTime());

// 增加2周 cal.add(Calendar.WEEK_OF_YEAR, 2); System.out.println("2周后: " + cal.getTime());

// 获取各个字段 int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); int month = cal.get(Calendar.MONTH) + 1; // +1,因为一月 = 0 System.out.println("日: " + dayOfMonth + ", 月: " + month); }}

缺点:可变性(add方法修改原始对象)、格式化复杂性、时区混乱。



2. 现代Date/Time API(Java 8+)

java.time包包含了关键类:LocalDate、LocalTime、LocalDateTime、ZonedDateTime、Instant等。它们都是不可变且线程安全的。



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 newYear = LocalDate.of(2025, Month.JANUARY, 1); System.out.println("新年: " + newYear);

// 日期运算 LocalDate nextWeek = today.plusWeeks(1); LocalDate lastMonth = today.minusMonths(1); System.out.println("下周: " + nextWeek); System.out.println("上个月: " + lastMonth);

// 比较 boolean isAfter = today.isAfter(newYear); // false System.out.println("今天在元旦之后吗? " + isAfter); }}


LocalTime — 处理时间

存储时间(小时、分钟、秒、纳秒)无日期。

import java.time.LocalTime;

public class LocalTimeExample { public static void main(String[] args) { // 当前时间 LocalTime now = LocalTime.now(); System.out.println("当前时间: " + now);

// 特定时间 LocalTime meetingTime = LocalTime.of(14, 30); System.out.println("会议时间: " + meetingTime);

// 时间运算 LocalTime inOneHour = now.plusHours(1); LocalTime tenMinutesAgo = now.minusMinutes(10);

// 比较 boolean isBefore = now.isBefore(meetingTime); System.out.println("现在在会议时间之前吗? " + isBefore); }}

博客

书籍推荐