Java日期处理:库与工具概览
日期和时间处理是Java开发中最常见的任务之一。长期以来,标准类 java.util.Date 和 java.util.Calendar 因其不直观、可变性以及线程安全问题而备受诟病。然而,随着Java 8的发布,情况发生了根本性的改变。在本概览中,我们将介绍Java中用于日期处理的主要库、它们的优势以及使用示例。
1. java.time (JSR-310) — 标准API
从Java 8开始,java.time 包成为处理日期和时间的主要工具。它由Joda-Time的作者Stephen Colebourne领导开发,并吸收了最佳实践。
关键类:
LocalDate— 不带时间的日期(年、月、日)。LocalTime— 不带日期的时间(时、分、秒、纳秒)。LocalDateTime— 不带时区的日期和时间。ZonedDateTime— 带时区的日期和时间。Instant— UTC时间点(机器可读表示)。Duration和Period— 用于处理时间间隔。
使用示例:
import java.time.*;import java.time.format.DateTimeFormatter;
public class JavaTimeExample { public static void main(String[] args) { // 当前日期 LocalDate today = LocalDate.now(); System.out.println("今天: " + today);
// 创建特定日期 LocalDate specificDate = LocalDate.of(2025, Month.MARCH, 15); System.out.println("特定日期: " + specificDate);
// 处理时间 LocalTime now = LocalTime.now(); LocalTime meetingTime = LocalTime.of(14, 30); System.out.println("会议时间: " + meetingTime);
// 格式化 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"); LocalDateTime event = LocalDateTime.of(2025, 12, 31, 23, 59); String formatted = event.format(formatter); System.out.println("格式化后: " + formatted);
// 日期差 Period period = Period.between(today, specificDate); System.out.println("距离3月15日的天数: " + period.getDays()); }}优点:内置于JDK、线程安全、不可变对象、丰富的API、支持所有时区。
2. Joda-Time
在java.time出现之前,Joda-Time实际上是Java中处理日期的事实标准。如今,它仅在旧项目(Java 8之前)中使用才有意义,因为开发者建议迁移到 java.time。
示例:
import org.joda.time.DateTime;import org.joda.time.Days;import org.joda.time.LocalDate;
public class JodaTimeExample { public static void main(String[] args) { // 当前日期 LocalDate today = LocalDate.now(); DateTime now = DateTime.now();
// 日期差 LocalDate start = new LocalDate(2025, 1, 1); LocalDate end = new LocalDate(2025, 12, 31); int days = Days.daysBetween(start, end).getDays(); System.out.println("之间的天数: " + days); }}缺点:需要外部依赖、更新不活跃、功能上不如java.time。
3. Apache Commons Lang 3
org.apache.commons.lang3.time 库提供了方便的日期处理工具,特别是在格式化、解析和计算方面。
常用类:
DateUtils— 用于