Save Load
GitHub 切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页

Java8 新提供时间 API

Java8新提供时间API

Java8新的日期和时间API的设计原则

Java8中新的日期和时间是基于JSR-310实现的,参考了绝大多数的joda-timeApi。

  • 不变性:新的日期/时间API中,所有的类都是不可变的,实现了线程安全;
  • 关注点分离:新的API中将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不同的类;
  • 清晰明了:新的API中,方法都被明确定义用以完成相同的行为,例如,想要拿到当前实例,可以用new()方法,在所有的类方法中都实现了 formate()和parse()方法,不再是之前用单独一个类去解决,而且新的API中所有的类都使用了工厂模式和策略模式;
  • 实用性:所有新的日期和时间API类都实现了一系列方法用以完成通用的需求,例如:加、减、格式化、解析、从日期或时间中提取单独部分等等;
  • 可扩展性:新的日期/时间API是基于国际标准ISO 8601,其实我们也是可以将其用于非IOS的日历上

Java8中的日期和时间API包含以下包

  • java.time包:这是新的Java日期/时间API的基础包,所有的主要基础类都是该包的一部分,例如:LocalDate、LocalTime、LocalDateTime、Instant、Period、Duration等类。这些类都是线程安全的
  • java.time.chrono包:这个包为非ISO的日历标准定义了一些泛化的API,我们可以拓展AbstractChronology来创建自己的日历标准
  • java.time.formate包:这个包包含能够格式化和解析日期时间对象的类,在绝大数情况下,我们不应该直接使用它,因为java.time包中相应的类已经提供了格式化和解析的方法
  • java.time.temporal包:这个包包含一些时态对象,可以用其找出关于某个日期/时间对象的某个特定日期或时间,比如说找到某个月的第一天或最后一天,可以根据withXXX的格式进行区分
  • java.time.zone包:这个包支持不同的时区以及相关规则的类
时间相关类 介绍
LocalDate 时间处理类,最高精确到天,没有时区的日期, LocalDate是不可变并且线程安全的
LocalTime 时间处理类,最高精确到分秒,没有时区的日期, LocalDate是不可变并且线程安全的
LocalDateTime 时间处理类,最高精确到纳秒, LocalDate是不可变并且线程安全的
DateTimeFormatter 时间格式化
ZoneId 时区设置类
Instant 用来表示时间线上的一个点(瞬时)
Clock 时钟,用于访问当前时刻、日期、时间,用到时区
Duration 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔
Period 用于计算两个“日期”间隔

获取当前日期、时间

        //now
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);    //2020-10-23T19:29:08.064

        //localDate
        LocalDate localDate = now.toLocalDate();
        System.out.println("localDate:"+localDate);//2020-10-23

        //localTime
        LocalTime localTime = now.toLocalTime();
        System.out.println("localTime:" + localTime); //19:29:08.064
        //year
        int year = now.getYear();
        System.out.println("year:" + year); //2020

获取时间戳

Instant timestamp = Instant.now();

格式化时间、指定时间日期创建对应的对象

时间格式化字符串

计算两个时间点的间隔

日历计算