一、 JDK8 中增加了一套全新的日期时间 API,这套 API 设计合理,是线程安全的。
- java.time – 包含值对象的基础包
- java.time.chrono – 提供对不同的日历系统的访问
- java.time.format – 格式化和解析时间和日期
- java.time.temporal – 包括底层框架和扩展特性
- java.time.zone – 包含时区支持的类
说明:大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽管有68个新的公开类型,大多数开发者,大概将只会用到其中的三分之一 。
新的日期及时间 API 位于 java.time 包下,如下是一些该包下的关键类:
LocalDate:表示日期,包含:年月日。格式为:2020-01-13
LocalTime:表示时间,包含:时分秒。格式为:16:39:09.307
LocalDateTime:表示日期时间,包含:年月日 时分秒。格式为:2020-01-13T16:40:59.138
DateTimeFormatter:日期时间格式化类
Instant:时间戳类
Duration:用于计算 2 个时间(LocalTime,时分秒)之间的差距
Period:用于计算 2 个日期(LocalDate,年月日)之间的差距
ZonedDateTime:包含时区的时间
提供这些方法:
二、使用JDK8中的日期时间
(1)获取当前日期
//当前日期LocalDate ld=LocalDate.now();System.out.println(ld);//当前时间LocalTime time=LocalTime.now();System.out.println(time);//日期和时间LocalDateTime tt=LocalDateTime.now();System.out.println(tt);
(2) 设置指定的时间
//设置指定的年、月、日、时、分、秒。没有偏移量LocalDateTime ldt = LocalDateTime.of(2024, 3, 20, 14, 10, 48);System.out.println(ldt);
(3)获取年月日时分秒
System.out.println("年:"+ldt.getYear());System.out.println("本月第几天:"+ldt.getDayOfMonth());System.out.println("日期周几:"+ldt.getDayOfWeek()); //枚举System.out.println("本月英文:"+ldt.getMonth()); //枚举System.out.println("本月数字:"+ldt.getMonthValue());System.out.println("一年中第几天:"+ldt.getDayOfYear());System.out.println("时:"+ldt.getHour());System.out.println("分:"+ldt.getMinute());System.out.println("秒:"+ldt.getSecond());
(4)设置偏移量 :plusXXX,minusXXX
// 获取当前日期LocalDateTime date = LocalDateTime.now();// 创建一个日期格式化器DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 使用格式化器格式化日期String str = date.format(formatter);System.out.println("系统当前日期:"+str);//下个月的今天LocalDateTime next=date.plusMonths(1);String str2 = next.format(formatter);System.out.println("下个月的今天: "+str2);//去年的今天LocalDateTime last=date.minusYears(1);String str3 = last.format(formatter);System.out.println("去年的今天: "+str3);
(5)设置时间/日期:withDayOfMonth()/withDayOfYear()/withMonth()/withYear()
// 获取当前日期LocalDateTime date = LocalDateTime.now();// 创建一个日期格式化器DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 使用格式化器格式化日期String str = date.format(formatter);System.out.println("系统当前日期:"+str);//上个月的第三天LocalDateTime third=date.minusMonths(1).withDayOfMonth(3);String str4 = third.format(formatter);System.out.println("上个月的第3天:"+str4);
(6)计算日期相对间隔(计算年龄)
//现在日期LocalDate now=LocalDate.now();//出生日期LocalDate bir=LocalDate.of(2001,3,1);//age=现在日期-出生日期Period period= Period.between(bir,now);//获取年龄int age=period.getYears();System.out.println("从"+bir+"出生到现在"+now+"的年龄是:"+age);
// 创建 LocalDate 对象LocalDate date = LocalDate.now();System.out.println(date);// 计算两个日期之间相差的时间LocalDate date2 = LocalDate.of(2023, 2, 10);System.out.println(date2);Period period = Period.between(date2, date);System.out.println(period.getYears() + "年" + period.getMonths() + "月" + period.getDays() + "天"); // 输出:0年11月11天// 创建 LocalTime 对象LocalTime time = LocalTime.now();System.out.println(time);// 计算两个时间点之间相差的时间LocalTime time2 = LocalTime.of(10, 30);System.out.println(time2);Duration duration = Duration.between(time2, time);System.out.println(duration.toHours() + "小时" + duration.toMinutes() % 60 + "分钟"); // 输出:6小时1分钟