前言
在Java8中,对于日期、时间、时间日期有不同的对象来表示,分别就是LocalDate、LocalTime、LocalDateTime
他们都位于java.time
包下,并且他们都仅单纯的表示一个不可变的时间对象,无时区等附加信息的出现
LocalDate
一个不可变的时间对象用来表示一个日期(年月日
),仅包含日期,例如2020-06-06
它的可表示范围为-999999999-01-01
到+999999999-12-31
LocalTime
一个不可变的时间对象,用来表示一个时间(时分秒
),最高精度为纳秒,例如11:11:11
它的表示范围为:00:00
到23:59:59.999999999
LocalDateTime
一个不可变的时间对象,用来表示一个日期时间(年月日时分秒
),最高精度为纳秒,例如2020-06-06T13:45:30.123456789
-999999999-01-01T00:00:00
到+999999999-12-31T23:59:59.999999999
LocalDate常用方法示例
LocalDate、LocalTime、LocalDateTime三者的使用方式基本相同,APi设计也类似,可以说掌握其中一个明白其他两个的用法了
此处以LocalDate的常用方法进行介绍:
初始化一个LocalDate
- now(…)系列: 获取当前日期
- of(…)系列 : 获取指定年月日日期
- parse(…)系列: 将日期字符串转换为LocalDate日期
- from(…)系列:将TemporalAccessor类型对象转换为LocalDate日期
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| /*now()*/ System.out.println(LocalDate.now());//获取当前日期 System.out.println(LocalDate.now(ZoneId.systemDefault()));//获取系统时区当前日期 System.out.println(LocalDate.now(Clock.systemDefaultZone()));//获取系统时钟当前日期 /*of()*/ System.out.println(LocalDate.of(2020, 6, 6));//获取指定年月日日期 System.out.println(LocalDate.of(2020, Month.JUNE, 6));//获取指定年月日日期 System.out.println(LocalDate.ofEpochDay(10));//获取大于1970-1-1多少天的日期 System.out.println(LocalDate.ofYearDay(2020, 200));//获取指定年份中的第几天的日期 /*parse()*/ System.out.println(LocalDate.parse("2017-05-05"));//DateTimeFormatter.ISO_LOCAL_DATE System.out.println(LocalDate.parse("2017-05-05", DateTimeFormatter.ISO_DATE)); System.out.println(LocalDate.parse("20170505", DateTimeFormatter.BASIC_ISO_DATE)); System.out.println(LocalDate.parse("2017-05-05+01:00", DateTimeFormatter.ISO_OFFSET_DATE)); /*from()*/ LocalDate.from(LocalDate.parse("2017-05-05"));//将TemporalAccessor类型对象转换为LocalDate日期
|
获取LocalDate中的信息
从已有的LocalDate中获取年、月、日等具体信息
1 2 3 4 5 6 7 8 9 10 11
| LocalDate localDate = LocalDate.now(); System.out.println(localDate.getYear());//获取年 System.out.println(localDate.getMonthValue());//月 System.out.println(localDate.getDayOfMonth());//日 System.out.println(localDate.getMonth());//月份 System.out.println(localDate.getDayOfWeek());//星期 System.out.println(localDate.getDayOfYear());//本年中的第几天
System.out.println("是否闰年:"+localDate.isLeapYear()); System.out.println("本月天数:"+localDate.lengthOfMonth()); System.out.println("本年天数:"+localDate.lengthOfYear());
|
修改LcoalDate的内容
可以对现有的LcoalDate对象进行修改
- plusxxx()系列
- minusxxx()系列
- withxxx()系列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| LocalDate localDate = LocalDate.now(); System.out.println("当前日期:"+localDate); System.out.println("3天后:"+localDate.plusDays(3)); System.out.println("1月后:"+localDate.plusMonths(1)); System.out.println("1年后:"+localDate.plusYears(1)); System.out.println("1周后:"+localDate.plusWeeks(1)); System.out.println("3天前:"+localDate.minusDays(3)); System.out.println("1月前:"+localDate.minusMonths(1)); System.out.println("1年前:"+localDate.minusYears(1)); System.out.println("1周前:"+localDate.minusWeeks(1));
System.out.println(localDate.withYear(2012));//指定某一年的今天 System.out.println(localDate.withMonth(12));//指定某月的今天 System.out.println(localDate.withDayOfMonth(1));//指定本月的第几天 System.out.println(localDate.withDayOfYear(1));//指定今年的第几天
|
三者之间的转化关系
既然上面的三个类是分别代表时间、日期、日期时间,那他们必定存在相互转化的关系
就这个关系,我们进行代码示例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| LocalDate localDate = LocalDate.of(2020,1,1); LocalTime localTime = LocalTime.now(); LocalDateTime localDateTime = LocalDateTime.now();
LocalDate ldt2ld = localDateTime.toLocalDate(); LocalTime ldt2lt = localDateTime.toLocalTime(); //localDateTime--->LocalDate System.out.println(localDateTime+"---> localDateTime.toLocalDate() --->"+ldt2ld); //localDateTime--->LocalTime System.out.println(localDateTime+"---> localDateTime.toLocalTime() --->"+ldt2lt);
LocalDateTime atDate = localTime.atDate(localDate); LocalDateTime atTime = localDate.atTime(localTime); LocalDateTime dateTime = LocalDateTime.of(localDate, localTime); //localDate+localTime--->LocalDateTime System.out.println("["+localDate+" + "+localTime+"] localDate.atTime(localTime) --->"+atTime); System.out.println("["+localDate+" + "+localTime+"] localTime.atDate(localDate) --->"+atDate); System.out.println("["+localDate+" + "+localTime+"] LocalDateTime.of(localDate, localTime) --->"+dateTime);
|
输出结果
1 2 3 4 5
| 2020-07-10T17:02:47.711---> localDateTime.toLocalDate() --->2020-07-10 2020-07-10T17:02:47.711---> localDateTime.toLocalTime() --->17:02:47.711 [2020-01-01 + 17:02:47.710] localDate.atTime(localTime) --->2020-01-01T17:02:47.710 [2020-01-01 + 17:02:47.710] localTime.atDate(localDate) --->2020-01-01T17:02:47.710 [2020-01-01 + 17:02:47.710] LocalDateTime.of(localDate, localTime) --->2020-01-01T17:02:47.710
|
总结
本文介绍的三个类,属于java时间库中较为常用的三个类,它代替了java8以前常用的Date和Calendar类,转变为以更加细粒度的时间、日期、时间日期概念进行时间处理。