日期处理
在Java8之前,操作日期的话不是很方便,有些地方需要自己编写实现。在Java8中的java.time包下新增很多关于日期处理的类,通过这些类可以使开发者更便捷的操作日期,这些类都是final修饰的,并且是线程安全的。
java8新增的关于日期处理的包:
-
- java.time
主要的日期处理相关的类都在这个包下 - java.time.chrono
这个包中的类主要是对应不同国家的日历记录的方式,国际上通用的日历是2018-01-01这种,但是有些国家有自己独特的记录日历的方式,比如我们国家的农历,不过可惜的是在这个包下没有农历相关的类。 - java.time.format
日期格式化相关的类在这个包下 - java.time.temporal
该包下存放着不同国家记录时间的方式相关的类 - java.time.zone
这个包下存放着设置时区相关的类,目前我们国家是在东八区。
- java.time
LocalDate:只能处理日期相关的数据,不包含时间
1 public static void main(String[] args) { 2 //获取当前日期 3 LocalDate date1 = LocalDate.now(); 4 System.out.println(date1); 5 6 int year = date1.getYear(); 7 int month = date1.getMonthValue(); 8 int day = date1.getDayOfMonth(); 9 10 //日期格式化 11 String date2 = date1.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")); 12 System.out.println(date2); 13 14 //是否是闰年 15 boolean leap = date1.isLeapYear(); 16 17 //判断当前月份的天数 18 int len = date1.lengthOfMonth(); 19 20 //自定义日期方式一 21 LocalDate date3 = LocalDate.parse("2017-07-11"); 22 //自定义日期方式二 23 LocalDate date4 = LocalDate.of(2017, 7, 11); 24 25 //判断日期是否相等 26 if(date3.equals(date4)){ 27 System.out.println("日期相等"); 28 } 29 30 //获取一周后的日期 31 LocalDate date5 = date1.plus(1, ChronoUnit.WEEKS); 32 System.out.println("一周后的日期:" + date5); 33 }
* LocalTime:只能处理时间,不包括日期
1 public static void main(String[] args) { 2 //获取当前时间 3 LocalTime time1 = LocalTime.now(); 4 //获取当前时间,不包含毫秒 5 LocalTime time2 = LocalTime.now().withNano(0); 6 System.out.println(time1); 7 System.out.println(time2); 8 9 //一小时后 10 LocalTime time3 = time1.plusHours(1); 11 System.out.println(time3); 12 13 //自定义时间 14 LocalTime time4 = LocalTime.parse("06:12:30"); 15 LocalTime time5 = LocalTime.of(6, 30, 12); 16 17 }
* LocalDateTime:可以处理日期和时间
1 public static void main(String[] args) { 2 LocalDateTime date1 = LocalDateTime.now(); 3 System.out.println(date1); 4 5 LocalDateTime date2 = LocalDateTime.of(2017, 7, 20, 13, 20, 15); 6 }
* Duration和period
1 public static void main(String[] args) { 2 LocalDate date1 = LocalDate.of(2017, 7, 11); 3 LocalDate date2 = LocalDate.of(2017, 7, 13); 4 //Period处理LocalDate 5 Period period = Period.between(date1, date2); 6 System.out.println(period.getDays()); 7 8 9 LocalTime time1 = LocalTime.of(18, 20, 10); 10 LocalTime time2 = LocalTime.of(18, 30, 10); 11 12 Duration duration = Duration.between(time1, time2); 13 System.out.println(duration.getSeconds()); 14 }
设定时区
通过ZoneId这个类中的of方法可以设定时区:
1 //获取本地的时区时间 2 ZonedDateTime now = ZonedDateTime.now(); 3 System.out.println(now); 4 5 //设定时区为美国洛杉矶 6 ZoneId zone = ZoneId.of("America/Los_Angeles"); 7 //获取指定的时区时间 8 ZonedDateTime usa = ZonedDateTime.now(zone); 9 System.out.println(usa);
函数式接口
jdk8中新增了函数式接口,在一个接口中只有一个抽象方法的接口被称为函数式接口,例如java.lang.Runnable,java.util.concurrent.Callable。jdk8中新增了@FunctionalInterface注解来标注一个函数式接口。
default方法
jdk8中新增了default方法,jdk8之前接口中的方法必须都是抽象的,在jdk8中允许接口中定义非抽象方法,在接口中的非抽象方法上使用default修饰即可,比如在jdk8中新增了一个函数式接口:java.util.function。java8中打破了接口中的方法必须都是抽象的这一规范,有一个好处就是可以提高程序的兼容性,在java.lang.Iterable接口中新增了forEach方法,该方法就是使用def