不要用 Java Calendar 处理时间了,有这么多方法可以使用!
Java 8 已经非常普遍了,但令人惊讶的是,仍然有人在项目中使用 Java Calendar
类来处理时间和日期。不仅性能差,代码还冗余。为什么不用 Java 8 提供的现代日期和时间 API 呢?
以下是总结的 18 种处理日期的方式,值得收藏。
Java 日期与时间的历史遗留问题
Java 处理日期、日历和时间的方式一直备受批评。java.util.Date
是可变类型,而 SimpleDateFormat
线程不安全。这使得它们的应用非常受限。
Java 8 引入的新 API 基于 ISO 标准日历系统,java.time
包下的所有类都是不可变且线程安全的。
示例 1:获取今天的日期
在 Java 8 中,LocalDate
用于表示当天日期,不包含时间。当你仅需表示日期时,应使用这个类。
import java.time.LocalDate;
public class Demo01 {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println("今天的日期:" + today);
}
}
示例 2:获取年、月、日信息
import java.time.LocalDate;
public class Demo02 {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.println("年:" + year);
System.out.println("月:" + month);
System.out.println("日:" + day);
}
}
示例 3:处理特定日期
通过 LocalDate.of()
方法,可以创建任意日期。这个方法避免了旧 API 中的问题,如年份起始于 1900、月份从 0 开始等。
import java.time.LocalDate;
public class Demo03 {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2018, 2, 6);
System.out.println("自定义日期:" + date);
}
}
示例 4:判断两个日期是否相等
import java.time.LocalDate;
public class Demo04 {
public static void main(String[] args) {
LocalDate date1 = LocalDate.now();
LocalDate date2 = LocalDate.of(2018, 2, 5);
if (date1.equals(date2)) {
System.out.println("时间相等");
} else {
System.out.println("时间不等");
}
}
}
示例 5:检查周期性事件(如生日)
无论年份如何,只要日期与生日匹配,就会输出祝贺信息。
import java.time.LocalDate;
import java.time.MonthDay;
public class Demo05 {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(2018, 2, 6);
MonthDay birthdayMd = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());
if (MonthDay.from(today).equals(birthdayMd)) {
System.out.println("今天是你的生日!");
} else {
System.out.println("你的生日还没到");
}
}
}
示例 6:获取当前时间
LocalTime
仅包含时间信息,没有日期。
import java.time.LocalTime;
public class Demo06 {
public static void main(String[] args) {
LocalTime time = LocalTime.now();
System.out.println("当前时间(不含日期):" + time);
}
}
示例 7:计算未来时间
通过 plusHours()
方法可以增加时间。所有这些操作返回的都是新的实例,因其不可变性。
import java.time.LocalTime;
public class Demo07 {
public static void main(String[] args) {
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(3);
System.out.println("三个小时后的时间为:" + newTime);
}
}
示例 8:计算一周后的日期
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class Demo08 {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
System.out.println("一周后的日期为:" + nextWeek);
}
}
示例 9:计算一年前或一年后的日期
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class Demo09 {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate previousYear = today.minus(1, ChronoUnit.YEARS);
LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
System.out.println("一年前的日期 : " + previousYear);
System.out.println("一年后的日期:" + nextYear);
}
}
示例 10:使用 Clock
获取时间戳
Clock
类可替代 System.currentTimeInMillis()
和 TimeZone.getDefault()
。
import java.time.Clock;
public class Demo10 {
public static void main(String[] args) {
Clock clock = Clock.systemUTC();
System.out.println("当前时间戳: " + clock.millis());
}
}
示例 11:判断日期早晚
通过 isBefore()
和 isAfter()
方法判断日期顺序。
import java.time.LocalDate;
public class Demo11 {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate futureDate = LocalDate.of(2025, 2, 6);
if (futureDate.isAfter(today)) {
System.out.println("未来的日期:" + futureDate);
}
}
}
结论
Java 8 新的日期和时间 API 提供了更简洁、安全且高效的方式处理时间相关任务。充分利用它,避免冗余的旧式 Calendar
和 Date
操作。
评论区