1.java8中的时间处理与之前的区别
Java8之前的处理日期、日历和时间的不足之处有:
将 java.util.Date 设定为可变类型、 SimpleDateFormat 的非线程安全使、解析的时间处理方式和显示出的时间格式都非常不符合我们的正常操作,需要经过很多麻烦的处理,比如借用java.util.Calendar类进行时间处理。
Java8则是一套新的API,基于ISO标准日历系统,java.time包下的所有类都是不可变类型和线程安全,并且解析时间和显示时间也更加符合我们正常使用的习惯,其中很多方法都非常便利,比如获取年月日,比较时间,日期等等。
2.java8中的时间获取
2.1 获取日期
Java 8 中的 LocalDate 用于表示当天日期它和 java.util.Date不同的是,它只显示日期不包含具体的时间,当仅仅需要表示日期时就可以直接使用这个类来表示。
public void getNowDate(){
LocalDate today = LocalDate.now();
System.out.println("java8中表示的今天的日期:" + today);
Date date = new Date();
System.out.println("java8之前表示的今天的时间:"+date);
}
很明显,java8中对日期的处理比之前的处理已经很人性化了。利用LocalDate类创建的当天的日期并没有不含具体的时间信息,打印出的日期格式非常友好而java8之前对时间的处理是 Date类进行创建,打印出一堆没有格式化的信息并且包含了具体的时间,需要经过特殊处理才能显示成java8的格式,可以看出java8的处理明显简捷了很多。
2. 获取年月日
Java 8 中的LocalDate 提供了获取年月日的非常便捷的方法,其实例还包含很多其它的日期属性。可以通过调用这些方法很方便的获取需要的日期信息,不用像以前一样需要依赖java.util.Calendar类进行一堆处理获取。
public void getDateByYearAndMonthAndDay(){
LocalDate today = LocalDate.now();
int year = today.getYear();
int month = today.getMonthValue();
int day = today.getDayOfMonth();
System.out.printf("java8中获取年 : %d \njava8中获取月 : %d \njava8中获取日 : %d \n", year, month, day);
}
3.判断两个日期是否相等
在实际使用的过程中,避免不了的是判断两个日期是否相等。比如:比对每年的生日或者节日日期然后做出具体业务处理,在Java 8中的LocalDate 重载了equal方法,可以直接进行比较。
LocalDate nowDate = LocalDate.now();
LocalDate birth = LocalDate.of(2021,6,4);
YearMonth year = YearMonth.of(birth.getYear(),birth.getMonth());
YearMonth newYear = YearMonth.from(nowDate);
if(year.equals(newYear)){
System.out.println("中奖了");
}else{
System.out.println("没中奖");
}
其中可以根据MonthDay类是不可变并且线程安全的值类型,并且忽略年只比较月日信息。
YearMonth类是不可变并且线程安全的值类型,并且忽略日只比较年月信息。
4.java8提供的处理时间的相关方法
4.1 now()方法,可以通过LocalDate或者LocalTime等类创建具体格式需求的当天日期(时间)。
4.1.1 LocalTime获取的时间默认为hh:mm:ss.nnn的形式
如果需要去掉纳秒可以使用withNano(0)进行处理,或者使用of方法进行处理。
public void getNowTime(){
LocalTime nowTime = LocalTime.now();
System.out.println("未处理的显示:"+nowTime);
LocalTime nowTime1 = nowTime.withNano(0);
System.out.println("withNano(0)处理的显示:"+nowTime1);
LocalTime nowTime2 = LocalTime.of(nowTime.getHour(),nowTime.getMinute(),nowTime.getSecond());
System.out.println("of()方法处理的显示:"+nowTime2);
}
4.2 of() 方法,可以通过LocalDate或者YearMonth类等创建具体格式需求的任意日期, 该方法需要传入年月日做参数,返回对应的LocalDate或者YearMonth类等调用类的实例。
其中格式化传入的年月日信息,比如getMoth(),输出英文月份和getMontValue(),输出具体的数字月份,传入后结果是一样的,所以传哪个都可以。
4.3 from()方法,可以通过LocalDate或者YearMonth类等创建具体格式需求的任意日期,与of()方法类似,需要传入一个java8的时间类的变量,可以与调用类相同也可以与调用类不同,返回结果都是一样的。
4.4 parse()方法构造日期
LocalDate date = LocalDate.parse("2021-06-04");
System.out.println(date);
字符串不按照yyyy-MM-dd格式会报如下错误:
4.5 获取本月第一天
LocalDate date = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
System.out.println(date);
4.6 获取本月第n天
LocalDate date = LocalDate.now().withDayOfMonth(15);
System.out.println(date);
4.7 获取本月最后一天,能够准确的判断任何年份的最后一天包括特殊的二月情况。
LocalDate date1 = LocalDate.of(2021,02,15).with(TemporalAdjusters.lastDayOfMonth());
LocalDate date2 = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
System.out.println("获取2021年2月的最后一天是: "+date1);
System.out.println("获取2021年6月的最后一天是: "+date2);
4.8 获取的该月第一个周五,别的情况类似
LocalDate date = LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY));
System.out.println(date);
4.9 isLeapYear() 方法判断是否是闰年
LocalDate date = LocalDate.now();
if(date.isLeapYear()){
System.out.println("今年是闰年");
}else{
System.out.println("今年不是闰年");
}