【Java8】日期操作 详解

152 阅读7分钟

1、概述

Java8之前

① Java8之前有date类,date类如果不格式化可读性十分差; ② simpledateformat方法中format和parse方法都是线程不安全的,不利于使用。

Java8

① 出现localdate,localdatetime,localtime这些类,使用了final来修饰,使得这些类是不可变的,一旦实例化,值就固定了,所以这些类都是线程安全的; ② 全新API明确了日期时间概念,例如: 瞬时(instant) 、 长短(duration) 、 日期 、 时间 、 时区和周期 。

2、核心类

① Instant :瞬时实例。 ② LocalDate :本地日期,不包含具体时间 例如:2014-01-14 ; ③ LocalTime :本地时间,不包含日期; ④ LocalDateTime :组合了日期和时间,但不包含时差和时区信息; ⑤ ZonedDateTime :最完整的日期时间,包含时区和相对UTC或格林威治的时差。 新API还引入了 ZoneOffSet 和 ZoneId 类,使得解决时区问题更为简便。解析、格式化时间的 DateTimeFormatter 类也全部重新设计

3、具体使用介绍

LocalDate

LocalDate类的实例是一个不可变对象,它只提供了简单的日期,并不含时间信息,是不可变的和线程安全的。

API方法描述
now根据当前时间创建LocalDate对象
of根据指定年月日创建LocalDate对象
getYear获得年份
getMonthValue获得月份
getMonth获得月份枚举值
getDayOfMonth获得月份天数(1-31)
getDayOfWeek获得星期几
getDayOfYear获得年份中的第几天(1-366)
lengthOfYear获得当年总天数
lengthOfMonth获得当月总天数
toEpochDay与时间纪元(1970年1月1日)相差的天数
plusDays加天
plusWeeks加周
plusMonths加月
plusYears加年
minusDays减年
minusWeeks减周
minusMonths减月
minusYears减年
withYear替换年份
withYear替换年份
withDayOfMonth替换日期
withDayOfYear替换日期
isBefore是否日期在之前
isAfter是否日期在之后
isEqual是否是当前日期
isleapYear是否是闰年

使用介绍

//(1)获取当前日期 2022-07-07
System.out.println(LocalDate.now());
//(2)获取指定日期 2000-03-05
System.out.println(LocalDate.of(2014, 3, 5));
//(3)获取日期的年份 2022
System.out.println(LocalDate.now().getYear());
//(4)获取日期的月份 7
System.out.println(LocalDate.now().getMonthValue());
//(5)获取日期的日子 7
System.out.println(LocalDate.now().getDayOfMonth());
//(6)获取日期的星期 THURSDAY
System.out.println(LocalDate.now().getDayOfWeek());
//(7)当天所在这一年的第几天 188
System.out.println(LocalDate.now().getDayOfYear());
//(8)获取当年天数 365
System.out.println(LocalDate.now().lengthOfYear());
//(9)获取当月天数 31
System.out.println(LocalDate.now().lengthOfMonth());
//(10)与时间纪元(1970年1月1日)相差的天数,负数表示在时间纪元之前多少天 19180
System.out.println(LocalDate.now().toEpochDay());
//B.运算
//(1)加一天
System.out.println("加1天:" + LocalDate.now().plusDays(1));
//(2)加一周
System.out.println("加1周:" + LocalDate.now().plusWeeks(1));
//(3)加一月
System.out.println("加1月:" + LocalDate.now().plusMonths(1));
//(4)加一年
System.out.println("加1年:" + LocalDate.now().plusYears(1));
//(5)减一天
System.out.println("减1天:" + LocalDate.now().minusDays(1));
//(6)减一周
System.out.println("减1周:" + LocalDate.now().minusWeeks(1));
//(7)减一月
System.out.println("减1月:" + LocalDate.now().minusMonths(1));
//(8)减一年
System.out.println("减1年:" + LocalDate.now().minusYears(1));
//C.替换
//(1)替换年份:2000-07-07
System.out.println("替换年份为2000:" + LocalDate.now().withYear(2000));
//(2)替换月份:2020-01-07
System.out.println("替换月份为1:" + LocalDate.now().withMonth(1));
//(3)替换日子:2020-07-01
System.out.println("替换日期为1:" + LocalDate.now().withDayOfMonth(1));
//(4)替换天数:一年中的第多少天
System.out.println("替换天数为1:" + LocalDate.now().withDayOfYear(1));
//D.比较
//(1)是否在当天之前
System.out.println("是否在当天之前:" + LocalDate.now().minusDays(1).isBefore(LocalDate.now()));
//(2)是否在当天之后
System.out.println("是否在当天之后:" + LocalDate.now().plusDays(1).isAfter(LocalDate.now()));
//(3)是否在当天
System.out.println("是否在当天:" + LocalDate.now().isEqual(LocalDate.now()));
//(4)是否是闰年
System.out.println("今年是否是闰年:" + LocalDate.now().isLeapYear());

LocalDate 与 String 之间的转换

//(1)从文本字符串获取LocalDate实例
LocalDate localdate = LocalDate.parse("2022-04-21");
System.out.println(localdate);
//(2)使用特定格式化形式从文本字符串获取LocalDate实例
String str = "2019-03-03";
DateTimeFormatter fmt1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse(str, fmt1);
System.out.println(date);
//(3)使用特定格式化形式将LocalDate转为字符串
LocalDate today = LocalDate.now();
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
String dateStr = today.format(fmt);
System.out.println(dateStr);

LocalDate 与 Date之间的转换

//(1)LocalDate转化为Date
ZonedDateTime zonedDateTime = LocalDate.now().atStartOfDay(ZoneId.systemDefault());
Date date = Date.from(zonedDateTime.toInstant());
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(date));
//(2)Date转化为LocalDate
LocalDate localDate = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println(localDate.format(DateTimeFormatter.ISO_LOCAL_DATE));

LocalTime:时分秒

常用api

方法描述
static LocalTime now()获取默认时区的当前时间
static LocalTime now(ZoneId zone)获取指定时区的当前时间
static LocalTime now(Clock clock)从指定时钟获取当前时间
of根据指定的时、分、秒获取LocalTime 实例
getHour获取小时字段
getMinute获取分钟字段
getSecond获取秒字段
getNano获取纳秒字段
plusHours增加小时数
plusMinutes增加分钟数
plusSeconds增加秒数
plusNanos增加纳秒数
minusHours减少小时数
minusMinutes减少分钟数
minusSeconds减少秒数
minusNanos减少纳秒数
compareTo时间与另一个时间比较
isAfter检查时间是否在指定时间之后
isBefore检查时间是否在指定时间之前

使用介绍

// A.获取
//(1)获取默认时区的当前时间 14:11:31.294
System.out.println(LocalTime.now());
//(2)获取指定时区的当前时间 14:11:31.392
System.out.println(LocalTime.now(ZoneId.of("Asia/Shanghai")));
//(3)从指定时钟获取当前时间 14:11:31.392
System.out.println(LocalTime.now(Clock.systemDefaultZone()));
//(4)指定获取时分秒
System.out.println(LocalTime.of(12, 30, 30));
//(5)指定获取时分
System.out.println(LocalTime.of(12, 30));
//(6)指定获取时分秒纳秒
System.out.println(LocalTime.of(12, 30, 30, 123));
//(7)获取小时字段
System.out.println("时: " + LocalTime.now().getHour());
//(8)获取分钟字段
System.out.println("分: " + LocalTime.now().getMinute());
//(9)获取秒字段
System.out.println("秒: " + LocalTime.now().getSecond());
//(10)获取纳秒字段
System.out.println("纳秒: " + LocalTime.now().getNano());
//B.计算
//(1)增加一小时
System.out.println("增加1小时: " + LocalTime.now().plusHours(1));
//(2)增加三十分钟
System.out.println("增加30分钟: " + LocalTime.now().plusMinutes(30));
//(3)增加三十秒
System.out.println("增加30秒: " + LocalTime.now().plusSeconds(30));
//(4)增加一万纳秒
System.out.println("增加10000纳秒:" + LocalTime.now().plusNanos(10000));
//(5)减少一小时
System.out.println("减少1小时: " + LocalTime.now().minusHours(1));
//(6)减少三十分钟
System.out.println("减少30分钟: " + LocalTime.now().minusMinutes(30));
//(7)减少三十秒
System.out.println("减少30秒: " + LocalTime.now().minusSeconds(30));
//(8)减少一万纳秒
System.out.println("减少10000纳秒:" + LocalTime.now().minusNanos(10000));
//C.比较
//(1)时间与另一个时间比较 0(相等)正数(大)负数(小)
System.out.println(LocalTime.now().compareTo(LocalTime.now()));
//(2)检查时间是否在指定时间之后
System.out.println(LocalTime.now().isAfter(LocalTime.now()));
//(3)检查时间是否在指定时间之前
System.out.println(LocalTime.now().isBefore(LocalTime.now()));

LocalTime与 String 之间的转换

//(1)从文本字符串获取LocalTime实例
LocalTime localTime1 = LocalTime.parse("12:30:30");
System.out.println(localTime1);
//(2)使用特定格式化形式从文本字符串获取LocalTime实例
LocalTime localTime2 = LocalTime.parse("12:30:30", DateTimeFormatter.ofPattern("HH:mm:ss"));
System.out.println(localTime2);
//(3)使用特定格式化形式将LocalTime转为字符串
DateTimeFormatter df1 = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime localTime3 = LocalTime.now();
System.out.println(localTime3.format(df1));

LocalDateTime:年月日时分秒

方法描述
static LocalDateTime now()获取默认时区的当前日期时间
static LocalDateTime now(Clock clock)从指定时钟获取当前日期时间
static LocalDateTime now(ZoneId zone)获取指定时区的当前日期时间
static LocalDateTime of(LocalDate date, LocalTime time)根据日期和时间对象获取LocalDateTime 实例
static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second) second)根据指定的年、月、日、时、分、秒获取LocalDateTime 实例
getYear获取年份
getMonth使用月份枚举类获取月份
getDayOfMonth获取日期在该月是第几天
getDayOfWeek获取日期是星期几
getDayOfYear获取日期在该年是第几天
getHour获取小时
getMinute获取分钟
getSecond获取秒
getNano获取纳秒
plusYears增加年
plusMonths增加月
plusWeeks增加周
plusDays增加天
plusHours增加小时
plusMinutes增加分
plusSeconds增加秒
plusNanos增加纳秒
minusYears减少年
minusMonths减少月
meminusWeeks减少周
minusDays减少天
minusHours减少小时
minusMinutes减少分
minusSeconds减少秒
minusNanos减少纳秒
isEqual判断日期时间是否相等
isBefore检查是否在指定日期时间之前
isAfter检查是否在指定日期时间之后

LocalDateTime与 String 之间的转换

//(1)获取日期部分
System.out.println(LocalDateTime.now().toLocalDate());
//(2)获取时间部分:时、分、秒
System.out.println(LocalDateTime.now().toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm:ss")));
//(3)从文本字符串获取LocalDateTime实例
LocalDateTime ldt2 = LocalDateTime.parse("2019-12-07T21:20:06.303995200");
System.out.println(ldt2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//(4)使用特定格式化形式从文本字符串获取LocalDateTime实例
DateTimeFormatter df1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt3 = LocalDateTime.parse("2019-12-07 21:20:06", df1);
System.out.println(ldt3);
//(5)使用特定格式化形式将LocalDateTime转为字符串
String ldt4 = df1.format(ldt3);
System.out.println(ldt4);

LocalDateTime与 Date之间的转换

//(1)LocalDateTime转化为Date
ZonedDateTime zdt = LocalDateTime.now().atZone(ZoneId.systemDefault());
Date date1 = Date.from(zdt.toInstant());
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date1));
//(2)Date转化为LocalDateTime
LocalDateTime localDateTime = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); 

制作不易,如果大家看到这里,请给个关注和三连,谢谢大家,后续会继续分享更新其他技术干货。欢迎留言区交流。 更多详细技术视频,欢迎进入B站,点击如下视频地址学习,

www.bilibili.com/video/BV1Co… 如果对你有帮助,记得点个三连和关注,感谢。