高级JAVA开发必备技能:java8 新日期时间API((二)JSR-310:常用的日期时间API)(JAVA 小虚竹)

简介: 高级JAVA开发必备技能:java8 新日期时间API((二)JSR-310:常用的日期时间API)(JAVA 小虚竹)

image.png

大家好,我是小虚竹。之前有粉丝私聊我,问能不能把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类说明

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png

    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);

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png

    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));

image.png

    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);

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png上面的例子说明了,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获取默认时区的风险和最佳实践


目录
相关文章
|
5天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
5天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
15天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
86 13
|
20天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
54 10
|
13天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
51 2
|
23天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
4天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
6天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
6天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
6天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
22 3