一、LocalDate、LocalTime、LocalDateTime介绍
LocalDate、LocalTime、LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601 (ISO-8601
日历系统是国际化组织制定的现代化公民的日期和时间的表达法)日历系统的日期、时间、日期和时间。从名称也可以看出来,第一种表示日期 年月日,第二种表示时间
时分秒,第三种表示年月日时分秒。
* ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则
* Instant: 用来表示时间线上的一个点(瞬时)
* LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的
* LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的
* LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的
* Clock: 用于访问当前时刻、日期、时间,用到时区
* Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔
* Period: 用于计算两个“日期”间隔
其中,LocalDate、LocalTime、LocalDateTime是新API里的基础对象,绝大多数操作都是围绕这几个对象来进行的,有必要搞清楚:
LocalDate : 只含年月日的日期对象
LocalTime :只含时分秒的时间对象
LocalDateTime : 同时含有年月日时分秒的日期对象
1、获取当当前时间
/** * 测试 LocalDate,LocalTime,LocalDateTime */ @Test public void testLocalDate()
{ LocalDate localDate = LocalDate.now(); //获取当前年月日 LocalTime localTime =
LocalTime.now(); //获取当前时分秒 //获取当前日期时间 LocalDateTime localDateTime =
LocalDateTime.now(); System.out.println("localDate:"+localDate+" localTime:"+
localTime+" localDateTime:"+localDateTime); } 输出结果: localDate:2020-07-01
localTime:21:24:19.925 localDateTime:2020-07-01T21:24:19.925
2、对时间进行加减
//获取指定时间 @Test public void testLocalDateTime(){ LocalDateTime localDateTime =
LocalDateTime.of(2020,06,02,12,22,23); System.out.println("指定时间:"+localDateTime)
; //对时间进行加减 LocalDateTime localDateTime1 = localDateTime.plusYears(2); System.
out.println("指定时间添加2年:"+localDateTime1); /** * 对日期时间进行加操作,使用
localDateTime.plus***(num) * 对日期时间进行减操作,使用 localDateTime.minus***(num) *
修改不限于,年、月、日、时、分、秒、纳秒 */ LocalDateTime localDateTime2 = localDateTime.plusMonths(
2); System.out.println("指定时间添加2月:"+localDateTime2); LocalDateTime localDateTime3
= localDateTime.minusDays(2); System.out.println("指定时间减少2天:"+localDateTime3); }
指定时间:2020-06-02T12:22:23 指定时间添加2年:2022-06-02T12:22:23 指定时间添加2月:2020-08-02T12:22:
23 指定时间减少2天:2020-05-31T12:22:23
对于LocalDate,只有精度大于或等于日的加减,如年、月、日;
对于LocalTime,只有精度小于或等于时的加减,如时、分、秒、纳秒;
对于LocalDateTime,则可以进行任意精度的时间相加减;
3、将年、月、日等修改为指定的值,并返回新的日期(时间)对象
其效果与时间日期相加减差不多,如今天是2018-01-13,要想变为2018-01-20有两种方式
a. localDate.plusDays(20L) -> 相加指定的天数
b. localDate.withDayOfYear(20) -> 直接指定到哪一天
4、获取日期的年月日周时分
5、时间日期前后的比较与判断
6、计算时间、日期间隔
Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔
//计算两个日期的日期间隔-年月日 LocalDate date1 = LocalDate.of(2018, 2, 13); LocalDate date2
= LocalDate.of(2017, 3, 12); //内部是用date2-date1,所以得到的结果是负数 Period period = Period
.between(date1, date2); System.out.println("相差年数 : " + period.getYears());
System.out.println("相差月数 : " + period.getMonths()); System.out.println("相差日数 : "
+ period.getDays()); //还可以这样获取相差的年月日 System.out.println(
"-------------------------------"); long years = period.get(ChronoUnit.YEARS);
long months = period.get(ChronoUnit.MONTHS); long days = period.get(ChronoUnit.
DAYS); System.out.println("相差的年月日分别为 : " + years + "," + months + "," + days);
//注意,当获取两个日期的间隔时,并不是单纯的年月日对应的数字相加减,而是会先算出具体差多少天,在折算成相差几年几月几日的 //计算两个时间的间隔 System
.out.println("-------------------------------"); LocalDateTime date3 =
LocalDateTime.now(); LocalDateTime date4 = LocalDateTime.of(2018, 1, 13, 22, 30,
10); Duration duration = Duration.between(date3, date4); System.out.println(
date3+ " 与 " + date4 + " 间隔 " + "\n" + " 天 :" + duration.toDays() + "\n" + " 时
:" + duration.toHours() + "\n" + " 分 :" + duration.toMinutes() + "\n" + " 毫秒 :"
+ duration.toMillis() + "\n" + " 纳秒 :" + duration.toNanos() + "\n" );
//注意,并没有获得秒差的,但既然可以获得毫秒,秒就可以自行获取了
7、当计算程序的运行时间时,应当使用时间戳Instant
8、使用自定义格式
9、自定义转化的格式一定要与日期类型对应
LocalDate只能设置仅含年月日的格式
LocalTime只能设置仅含时分秒的格式
LocalDateTime可以设置含年月日时分秒的格式
注:格式的写法必须与字符串的形式一样
2018-01-13 21:27:30 对应 yyyy-MM-dd HH:mm:ss
20180113213328 对应 yyyyMMddHHmmss 否则会报运行时异常!
但要记住:得到的最终结果都是类似2018-01-13T21:27:30的格式,因为在输出LocalDateTime对象时,会调用其重写的toString方法。
10、将时间日期对象转为格式化后的时间日期对象