深入了解Java 8日期时间新玩法之Year、YearMonth、MonthDay、DayOfWeek
?
推荐语
在这篇文章中,我们将深入探讨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接口,可以根据时间顺序进行比较。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!