推荐语
在这篇文章中,我们将深入探讨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);//输出结果:1dayOfWeek = DayOfWeek.MONDAY;String dayName = dayOfWeek.toString(); // 获取日期名称(如MONDAY、TUESDAY等)System.out.println(dayName);//输出结果:MONDAYDayOfWeek dayOfWeekFromNumber = DayOfWeek.of(1); // 通过数字值创建DayOfWeek对象System.out.println(dayOfWeekFromNumber);//输出结果:MONDAY
}
总结
Year、YearMonth、MonthDay、DayOfWeek是Java 8中新增的日期时间API的一部分,它们提供了更灵活和强大的日期和时间处理能力。这些类都是不可变的,意味着一旦创建了对象,其值就不能更改。这种设计使得对这些对象的并发操作更加安全和高效。同时,这些类都实现了Comparable接口,可以根据时间顺序进行比较。