深入了解Java 8日期时间新玩法之Year、YearMonth、MonthDay、DayOfWeek

2023-12-14 01:24:47

?

推荐语

在这篇文章中,我们将深入探讨Java 8中Year、YearMonth、MonthDay和DayOfWeek类的功能和使用方法。这些类是在Java 8中引入的新的日期时间API的一部分,它们为我们提供了更灵活、更易用的日期和时间处理能力。

尽管这些类在Java 8中已经出现,但是对许多开发人员来说,它们可能仍然相对陌生。因此,本文旨在帮助读者更好地理解这些类的基本概念、核心方法和实际应用场景。虽然本文是一些相对较基础的内容,但我们希望通过分享这些知识,能够激发您对Java日期时间处理的兴趣和热情。

如果您对Java日期时间处理有更深入的需求或问题,我们鼓励您在评论区留言,让我们一起探讨和学习。当然,如果方便话,麻烦小伙伴能够把免费的点赞、收藏,走上一波!创作不易,感谢支持!

注意

本文编写的单元测试是基于java11,具体的版本号是:11.0.19

Year

Java 8中,Year类是一个不可变、线程安全的类,用于表示和操作年份。它主要用于处理与年份相关的日期和时间操作,例如获取当前年份、创建指定年份的Date对象等。

核心方法:

  • now():该方法返回表示当前日期的Year对象。该方法使用系统默认的时区来获取当前年份。
  • now(Clock clock):该方法返回表示指定时间戳的Year对象。该方法使用指定的Clock对象来获取当前年份。
  • of(int year):该方法用于创建一个表示指定年份的Year对象。如果输入的年份参数不在范围内(公元1年-公元9999年),则会抛出IllegalArgumentException异常。
@Test
public void test3() {
    // 使用now()方法获取当前年份
    Year year = Year.now();
    int currentYear = year.getValue(); // 获取年份的值
    System.out.println("当前年份:" + currentYear);
    // 使用now(Clock clock)方法获取指定时间戳的年份
    Clock clock = Clock.systemDefaultZone();
    Year yearFromClock = Year.now(clock);
    int yearFromClockValue = yearFromClock.getValue(); // 获取年份的值
    System.out.println("指定时间戳的年份:" + yearFromClockValue);
    // 使用of()方法创建指定年份的Year对象
    Year customYear = Year.of(2023);
    int customYearValue = customYear.getValue(); // 获取年份的值
    System.out.println("自定义年份:" + customYearValue);
}

YearMonth

YearMonth类代表一个特定的年和月,可以表示任何合法的年和月组合,例如2020-02。它主要用于处理与年和月相关的日期和时间操作。

核心方法:

  • now():获取当前年份和月份。例如,YearMonth.now()将返回当前的年和月。
  • of(int year, int month):创建一个表示特定年和月的YearMonth对象。例如,YearMonth.of(2020, 2)将创建一个表示2020年2月的YearMonth对象。
  • lengthOfMonth():返回当前YearMonth实例有多少天。例如,YearMonth.of(2020, 2).lengthOfMonth()将返回29,因为2020年是闰年,2月有29天。
@Test
public void test3() {
    // 获取当前年和月
    YearMonth currentYearMonth = YearMonth.now();
    System.out.printf("这个月的年月 %s 有 %d 天 %n", currentYearMonth, currentYearMonth.lengthOfMonth());
    // 创建一个表示特定年和月的YearMonth对象
    YearMonth creditCardExpiry = YearMonth.of(2018, Month.JULY);
    System.out.printf("你输入的年月是 %s %n", creditCardExpiry);
}

这个示例中,YearMonth.now()方法获取了当前的年和月,并使用lengthOfMonth()方法获取了当前年月的天数。另外,YearMonth.of(2018, Month.JULY)方法创建了一个表示2018年7月的YearMonth对象,并输出了该对象。

MonthDay

在Java 8中,MonthDay是一个非常实用的类,它用于处理只有月和日的信息,而没有年和其他时间信息的情况。这可以用于处理生日、纪念日和星座等周期性问题。

核心方法:

of(int month, int day): 创建一个表示特定月日的MonthDay对象。

from(LocalDate): 从给定的LocalDate对象中提取月和日的信息,创建一个新的MonthDay对象。

equals(Object): 比较两个MonthDay对象是否相等。

这些方法的具体使用示例如下:

@Test
public void test3() {
    // 创建一个表示7月18日的MonthDay对象
    MonthDay monthDay = MonthDay.of(7, 18);
    // 从当前日期创建一个MonthDay对象
    LocalDate localDate = LocalDate.now();
    MonthDay day = MonthDay.from(localDate);
    // 检查两个MonthDay对象是否相等
    if (monthDay.equals(day)) {
        System.out.println("Many Many happy returns of the day !!");
    } else {
        System.out.println("Sorry, today is not your birthday");
    }
}

此外,你还可以使用MonthDay对象来计算两个日期之间相差的天数、月数或年数。例如,要计算两个给定的日期之间包含多少天,多少周或者多少年,可以使用ChronoUnit.DAYS.between(),ChronoUnit.WEEKS.between(),ChronoUnit.YEARS.between()等方法。

DayOfWeek

Java 8中的DayOfWeek是一个不可变的、线程安全的枚举,表示一周中的一天,如MONDAY、TUESDAY等,适用于需要表示一周中某一天的场景。除了日期名称,DayOfWeek也有一个数字值。可以使用数字值来获取日期名称,也可以通过日期名称来获取数字值。

核心方法:

  • getValue():获取数字值(1-7)。
  • toString():获取日期名称(如MONDAY、TUESDAY等)。
  • of():通过数字值创建DayOfWeek对象。
@Test
public void test3() {
    DayOfWeek dayOfWeek = DayOfWeek.MONDAY;
    int dayNumber = dayOfWeek.getValue(); // 获取数字值(1-7)
    System.out.println(dayNumber);//输出结果:1
    dayOfWeek = DayOfWeek.MONDAY;
    String dayName = dayOfWeek.toString(); // 获取日期名称(如MONDAY、TUESDAY等)
    System.out.println(dayName);//输出结果:MONDAY
    DayOfWeek dayOfWeekFromNumber = DayOfWeek.of(1); // 通过数字值创建DayOfWeek对象
    System.out.println(dayOfWeekFromNumber);//输出结果:MONDAY
}

总结

Year、YearMonth、MonthDay、DayOfWeek是Java 8中新增的日期时间API的一部分,它们提供了更灵活和强大的日期和时间处理能力。这些类都是不可变的,意味着一旦创建了对象,其值就不能更改。这种设计使得对这些对象的并发操作更加安全和高效。同时,这些类都实现了Comparable接口,可以根据时间顺序进行比较。

文章来源:https://blog.csdn.net/fox9916/article/details/134857659
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。