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的日历上
- 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();