目 录CONTENT

文章目录

不要用 Java Calendar 处理时间了,有这么多方法可以使用

在等晚風吹
2024-09-18 / 0 评论 / 0 点赞 / 12 阅读 / 0 字 / 正在检测是否收录...

不要用 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 提供了更简洁、安全且高效的方式处理时间相关任务。充分利用它,避免冗余的旧式 CalendarDate 操作。

0

评论区