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); }}