Java 8 系列文章 持续更新中
日期时间API 也是Java 8重要的更新之一,Java从一开始就缺少一致的日期和时间方法,Java 8 Date Time API是Java核心API的一个非常好的补充 。
为什么需要新的日期时间APIJava中现有的与日期和时间相关的类存在一些问题:
- 日期时间类的定义不一致,在
java.util
和java.sql
包中都有Date
类 。同样,格式化和解析类是在java.text
包中定义的 。 java.util.Date
同时包含日期和时间值 , 而java.sql.Date
只包含日期值,把它放在java.sql
包中是没有意义的 。而且这两个类的名称相同,这本身就是一个非常糟糕的设计 。- 没有为时间、时间戳、格式化和解析明确定义的类 。我们有
java.text.DateFormat
抽象类用于解析和格式化,通常使用SimpleDateFormat
类解析和格式化 。 - 所有
Date
类都是可变的 , 所以它们不是线程安全的 , 这也是JavaDate
和Calendar
类最大的问题之一 。 Date
类不提供国际化,不支持时区 。虽然引入了java.util.Calendar
和java.util.TimeZone
,但是它们也存在上面的问题 。
Date
和Calendar
类中定义的方法还有一些其他的问题,但是上面的问题清楚地表明,Java中需要一个健壮的日期时间API 。这就是为什么 Joda Time 可以成为Java 日期时间高质量的替代品 。Java 8日期时间设计原则Java 8日期时间API是基于 JSR-310 规范实现的 。目的是为了解决遗留日期时间实现中的所有缺陷 。新的日期时间API的一些设计原则如下:
- 不变性:新的日期时间API中的所有类都是不可变的,适用于多线程环境 。
- 关注点分离:新的日期时间API明确区分了人类可读的日期、时间和机器时间(Unix时间戳) , 它为
Date
、Time
、DateTime
、Timestamp
、Timezone
等定义单独的类 。
- 清晰性:所有的类中都清晰地定义了方法 , 并执行相同的操作 。例如 , 要获取当前时间实例可以用
now()
方法,在所有这些类中都定义了format()
和parse()
方法,而不是为它们单独定义一个类 。
所有类都使用工厂模式和策略模式来更好地操作 。一旦您使用了其中一个类中的方法,使用其他类并不困难 。
- 实用的操作:所有新的日期时间API类都常见的方法,比如加、减、格式化、解析、在日期/时间中获取单独的部分等等 。
- 可扩展:新的日期时间API可以在
ISO-8601
日历系统上工作 , 但是我们也可以在其他非ISO
日历上使用它 。
java.time
:这是Java 8日期时间API的基本包 。所有主要的基类都是这个包的一部分,例如LocalDate
、LocalTime
、LocalDateTime
、Instant
、Period
、Duration
等 。所有这些类都是不可变的和线程安全的 。大多数情况下,这些类足以处理常见的需求 。java.time.chrono
:这个包为非ISO
日历系统定义了通用API 。我们可以扩展AbstractChronology
类来创建我们自己的日历系统 。java.time.format
:这个包包含用于格式化和解析日期时间对象的类 。大多数时候我们不会直接使用它们,因为java.time
包中的日期时间类已经提供了格式化和解析方法 。java.time.temporal
:这个包包含temporal对象 , 我们可以使用它来找出与日期/时间对象相关的特定日期或时间 。例如 , 我们可以使用它们来查找一个月的第一天或最后一天 。您可以很容易地识别这些方法,因为它们的格式总是withXXX
。java.time.zone
:这个包包含用于支持不同时区及其规则的类 。
1.LocalDate
LocalDate
是一个不可变的日期类,它以yyyy-MM-dd
的默认格式表示日期 。可以使用now()
方法来获取当前日期,还可以提供年、月和日期的输入参数来创建LocalDate
实例 。这个类为
now()
提供了一个重载方法,在这里可以传递ZoneId
来获取特定时区中的日期 。这个类提供了与
推荐阅读
- java中的垃圾回收算法与垃圾回收器
- 我终于会写 Java 的定时任务了!
- Java 8 Stream API 引入和使用
- Java并发编程 | Synchronized原理与使用
- javascript编程单线程之同步模式
- java程序员在交接别人的工作时如何保证顺利交接?
- OpenAPI 接口幂等实现
- 都卷Java,你看看你得学多少技术栈才能工作!
- JavaScript函数式编程之函子
- 4 .NET 6学习笔记——如何在.NET 6的Desktop App中使用Windows Runtime API