现在开始忘了jdks1.8之前的时间日期API,开始一个新的纪元。jdk1.8的时间日期API简直不要太好用,谁用谁知道。接下来让我们一起探索这个新的API。:D
这些新的API位于java.time包下,我们接下来按照开发者使用的角度来探索如何使用新的API。说到日期,首先我们想到的就是如何获取今日的日期,那让我们看看新的API是如何做的吧。
public static void main(String[] args) {
//获取当前日期: 2019-08-10
LocalDate today = LocalDate.now();
//获取年:2019
int year = today.getYear();
//获取月:8
int month = today.getMonthValue();
//获取日:10
int day = today.getDayOfMonth();
}
注意:System.out.println(today);本文都会省略。
当然,我们可以从today对象中获取年,月,日。这些方法是不是很容易记忆,而且没有1.8之前的Date获取年份后会减去1900,获取月份减去1。所以新版的API是一种人机交互友好的API,不用开发者过多的记忆和考虑杂七杂八的问题。再让我们看看如何获取昨天和明天吧,显然昨天就是在今天的日上减去1(其实就是相当于加上-1),明天是在今天的基础上加上1。既然是含有“加”含义的方法,那么API的方法中肯定含有plus,敲出today.plus看看IntelliJ IDEA 都有哪些提示。
看,我们发现了什么。:D 是不是很酷?当然了,如果我们敲出today.minus也是会出现对应的方法,只不过minus是减的意思。来看看plusDay的源码注释~
我们简单看看注释,返回一个在此LocalDate对象上指定加了多少天的副本,此方法将指定的数量添加到days字段上,并根据需要递增month和year字段,以确保结果仍然有效。当超出最大/最小年份时,结果无效。举例:2008-12-31加上一天后的结果为2009-01-01。此实例是不可变的,不受此方法调用的影响。参数:指定加的天数,可能是负数。返回:基于此LocalDate对象相加天数后返回的LocalDate,不为null。抛出异常情况:如果结果超出日期范围抛出DateTimeException异常。
现在我们知道如何获取与今天指定相隔多少天,多少周,多少月,多少年的方法了,那么我们再来看看如何判断获取后的LocalDate对象与今天LocalDate对象的大小比较。API中提供了实例方法,isAfter(ChronoLocalDate other),isBefore(ChronoLocalDate other)
//获取昨天的LocalDate对象:2019-08-09
LocalDate yesterday = today.plusDays(-1);
//获取明天的LocalDate对象:2019-08-11
LocalDate tomorrow = today.plusDays(1);
//判断yesterday是不是在today之后:false
boolean flag = yesterday.isAfter(today);
//判断yesterday是不是在today之前:true
boolean flag1 = yesterday.isBefore(today);
接下来,我们看看如何创建一个“1994-08-10”LocalDate的对象。并将其与today比较
//根据年月日创建LocalDate对象:2019-08-10
LocalDate otherDay = LocalDate.of(2019,8,10);
//根据文本创建LocalDate对象:1994-08-10
LocalDate birthday = LocalDate.parse("1994-08-10");
//判断两个日期是否相等:true
boolean isSameDay = otherDay.equals(today);
//判断两个日期是否相等:false
boolean isBirthday = birthday.equals(today);
如果想在一个LocalDate对象上修改年、月、日而后获取新的LocalDate对象,我们可以使用withYear(int year),withMonth(int month),withDayOfMonth(int dayOfMonth)。
//在otherDay基础上年月日都向后移动1个单位:2020-09-11
LocalDate anotherDay = otherDay.withYear(2020).withMonth(9).withDayOfMonth(11);
//获取2020年最后一天:2020-12-31
LocalDate lastDay = anotherDay.withDayOfYear(366);
//判断2020年是否为闰年:true
boolean isLeapYear = lastDay.isLeapYear();
可以看到withDayOfMonth和withDayOfYear的区别,前者是当月的天,范围在0-31,后者是当年的天,范围在1-366,闰年才会有366。
最后补充几个实用的方法:
//根据字符串文本创建LocalDate对象(JAVA诞生日):1995-05-23
LocalDate javaBirthday = LocalDate.parse("1995-05-23");
//判断 javaBirthday 是否为闰年:false
boolean isLeapYear = lastDay.isLeapYear();
//获取 javaBirthday 是哪一年:1995
int weekBasedYear = javaBirthday.get(IsoFields.WEEK_BASED_YEAR);
//获取 javaBirthday 是该年的第几周:21
int weekOfWeekBasedYear = javaBirthday.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
//获取 javaBirthday 是该年的第几季度:2
int quarterOfYear = javaBirthday.get(IsoFields.QUARTER_OF_YEAR);
//获取 javaBirthday 是该季度的第几天:53
int daysOfQuarter = javaBirthday.get(IsoFields.DAY_OF_QUARTER);
如果对你有帮助,请同学们关注点赞~