大家好,我是小虚竹。之前有粉丝私聊我,问能不能把JAVA8 新的日期时间API(JSR-310)知识点梳理出来。答案是肯定的,谁让我宠粉呢。由于内容偏多(超十万字了),会拆成多篇来写。
闲话就聊到这,请看下面的正文。
文章目录
常用的日期时间API简介
Clock
Clock类说明
FixedClock
Clock.fixed
Clock.fixed 跟 Offset 方法更配
OffsetClock
SystemClock
Clock.systemDefaultZone()
Clock.systemUTC()
结论
TickClock
Instant
Instant类说明
Instant常用的用法
Instant是没有时区的,但是Instant加上时区后,可以转化为ZonedDateTime
long型时间戳转Instant
Instant的坑
LocalDate
LocalDate类说明
LocalDate常用的用法
获取当前日期
获取localDate对象
获取指定日期的年月日
修改年月日
比较日期
LocalDate 和String相互转化、Date和LocalDate相互转化
LocalDate 和String相互转化
Date和LocalDate相互转化
LocalDateTime
LocalDateTime类说明
LocalDateTime常用的用法
获取当前日期和时间
获取指定日期和时间
日期时间的加减法及修改
LocalDateTime和Date相互转化
Date转LocalDateTime
LocalDateTime转Date
LocalTime
LocalTime类说明
LocalTime常用的用法
获取当前时间
获取LocalTime对象
获取指定日期的时分秒
修改时分秒
比较时间
OffsetDateTime
OffsetDateTime类说明
OffsetDateTime常用的用法
获取当前日期时间
获取OffsetDateTime对象
获取指定日期的年月日时分秒
修改年月日时分秒
比较日期时间
字符串转化为OffsetDateTime对象
OffsetTime
OffsetTime类说明
OffsetTime常用的用法
获取当前时间
获取OffsetTime对象
获取指定时间的时分秒
修改时分秒
比较时间
ZonedDateTime
ZonedDateTime类说明
ZonedDateTime常用的用法
获取当前日期时间
获取ZonedDateTime对象
获取指定日期的年月日时分秒
修改年月日时分秒
比较日期时间
LocalDateTime+ZoneId变ZonedDateTime
推荐相关文章
hutool日期时间系列文章
其他
常用的日期时间API简介
介绍下java8API比较常用的日期时间API,按java.time 包的类顺序:
Clock:时钟
Instant:瞬间时间。
LocalDate:本地日期。只有表示年月日
LocalDateTime:本地日期时间,LocalDate+LocalTime
LocalTime:本地时间,只有表示时分秒
OffsetDateTime:有时间偏移量的日期时间(不包含基于ZoneRegion的时间偏移量)
OffsetTime:有时间偏移量的时间
ZonedDateTime:有时间偏移量的日期时间(包含基于ZoneRegion的时间偏移量)
博主把这些类都点开看了,都是属于不可变类。而且官方也说了,java.time包 下的类都是线程安全的。
Clock
Clock类说明
Clock tickClock = Clock.tick(Clock.systemDefaultZone(),Duration.ofHours(1L)); Clock tickMinutes = Clock.tickMinutes(ZoneId.of("Asia/Shanghai")); Clock tickSeconds = Clock.tickSeconds(ZoneId.of("Asia/Shanghai")); LocalDateTime tickClockLocalDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(tickClock.millis()),ZoneId.of("Asia/Shanghai")); LocalDateTime tickMinutesLocalDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(tickMinutes.millis()),ZoneId.of("Asia/Shanghai")); LocalDateTime tickSecondsLocalDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(tickSeconds.millis()),ZoneId.of("Asia/Shanghai")); System.out.println("tickClock :"+tickClock.millis() +" 转为date时间:"+tickClockLocalDateTime); System.out.println("tickMinutes:"+tickMinutes.millis() +" 转为date时间:"+tickMinutesLocalDateTime); System.out.println("tickSeconds:"+tickSeconds.millis() +" 转为date时间:"+tickSecondsLocalDateTime);
LocalDateTime currentTime = LocalDateTime.now(); // 当前日期和时间 System.out.println("------------------时间的加减法及修改-----------------------"); //3.LocalDateTime的加减法包含了LocalDate和LocalTime的所有加减,上面说过,这里就只做简单介绍 System.out.println("3.当前时间:" + currentTime); System.out.println("3.当前时间加5年:" + currentTime.plusYears(5)); System.out.println("3.当前时间加2个月:" + currentTime.plusMonths(2)); System.out.println("3.当前时间减2天:" + currentTime.minusDays(2)); System.out.println("3.当前时间减5个小时:" + currentTime.minusHours(5)); System.out.println("3.当前时间加5分钟:" + currentTime.plusMinutes(5)); System.out.println("3.当前时间加20秒:" + currentTime.plusSeconds(20)); //还可以灵活运用比如:向后加一年,向前减一天,向后加2个小时,向前减5分钟,可以进行连写 System.out.println("3.同时修改(向后加一年,向前减一天,向后加2个小时,向前减5分钟):" + currentTime.plusYears(1).minusDays(1).plusHours(2).minusMinutes(5)); System.out.println("3.修改年为2025年:" + currentTime.withYear(2025)); System.out.println("3.修改月为12月:" + currentTime.withMonth(12)); System.out.println("3.修改日为27日:" + currentTime.withDayOfMonth(27)); System.out.println("3.修改小时为12:" + currentTime.withHour(12)); System.out.println("3.修改分钟为12:" + currentTime.withMinute(12)); System.out.println("3.修改秒为12:" + currentTime.withSecond(12));
System.out.println("------------------方法一:分步写-----------------------"); //实例化一个时间对象 Date date = new Date(); //返回表示时间轴上同一点的瞬间作为日期对象 Instant instant = date.toInstant(); //获取系统默认时区 ZoneId zoneId = ZoneId.systemDefault(); //根据时区获取带时区的日期和时间 ZonedDateTime zonedDateTime = instant.atZone(zoneId); //转化为LocalDateTime LocalDateTime localDateTime = zonedDateTime.toLocalDateTime(); System.out.println("方法一:原Date = " + date); System.out.println("方法一:转化后的LocalDateTime = " + localDateTime); System.out.println("------------------方法二:一步到位(推荐使用)-----------------------"); //实例化一个时间对象 Date todayDate = new Date(); //Instant.ofEpochMilli(long l)使用1970-01-01T00:00:00Z的纪元中的毫秒来获取Instant的实例 LocalDateTime ldt = Instant.ofEpochMilli(todayDate.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); System.out.println("方法二:原Date = " + todayDate); System.out.println("方法二:转化后的LocalDateTime = " + ldt);
上面的例子说明了,LocalDateTime是可以转成ZonedDateTime的。
推荐相关文章
hutool日期时间系列文章
1DateUtil(时间工具类)-当前时间和当前时间戳
2DateUtil(时间工具类)-常用的时间类型Date,DateTime,Calendar和TemporalAccessor(LocalDateTime)转换
3DateUtil(时间工具类)-获取日期的各种内容
4DateUtil(时间工具类)-格式化时间
5DateUtil(时间工具类)-解析被格式化的时间
6DateUtil(时间工具类)-时间偏移量获取
7DateUtil(时间工具类)-日期计算
8ChineseDate(农历日期工具类)
9LocalDateTimeUtil(JDK8+中的{@link LocalDateTime} 工具类封装)
10TemporalAccessorUtil{@link TemporalAccessor} 工具类封装
其他
要探索JDK的核心底层源码,那必须掌握native用法
万字博文教你搞懂java源码的日期和时间相关用法
java的SimpleDateFormat线程不安全出问题了,虚竹教你多种解决方案
源码分析:JDK获取默认时区的风险和最佳实践