Joda Time项目和java8时间api

  • 2019 年 10 月 6 日
  • 筆記

Joda Time出现的背景

在java1.0中,对日期和时间的支持只能依赖java.util.Date类。正如类名所表达的,这个类无法表示日期,只能以毫秒的精度表示时间。更糟糕的是它的易用性,由于某些未知的设计决策,这个类的易用性被深深的损害了,比如:年份的起始日期选择是1990年,月份的起始从0开始。在java1.1中,Date类中的很多方法被废弃了,取而代之的是java.util.Calendar类。Calendar类也有类似的问题和设计缺陷,导致使用这些方法写出的代码非常容易出错。比如月份依旧是从0开始计算(拿掉了由1990年开始计算年份这一设计)。更糟的是,有的特性只在某一个类有提供,比如用于语言无关方式格式化和解析日期或时间的DateFormat方法就只在Date类有。 DateFormat不是线程安全的,二个线程同时使用formatter解析日期,你可能会得到无法预期的结果。 在jdk1.8之前,这些问题使得用户们使用了第三方日期和时间库,比如Joda Time。jdk1.8大量借鉴了Joda Time特任。

Joda Time项目

Java SE 8之前的标准日期和时间类很差。通过解决这个问题,Joda-Time在Java SE 8之前成为Java的实际标准日期和时间库。请注意,从Java SE 8起,用户被要求迁移到java.time(JSR-310) – JDK的核心部分,取代了这个项目。如果我们工作中的jdk版本是1.8版本之前可以使用Joda Time项目,Joda项目中其实包括的不止Joda Time,还包括Joda-Money ,Joda-Beans,Joda-Convert ,Joda-Collect,Joda Primitives项目,有兴趣可以在Joda官网地址中了解一下。

pom依赖:

第一个demo:

什么是UTC时间? 没有时区概念,比如utc时间 为2010-12-1T11:22:33.567Z,如果是表示时区概念一般2010-12-1T11:22:33.567+08:00

关于Joda Time其他的日期和时间api可以看其依赖包下的具体类,具体使用方式也很简单看齐javadoc即可。

java8时间api

LocalDate,LocalTime

LocalDate类的实例是一个不可变的对象,只提供了简单的日期,并不包含当前的时间信息(只关注与年月日)。也不附带任何与时区相关的信息。 LocalTime类关注时分秒。

LocalDateTime

一个没有时区概念的日期-时间类在ISO-8601 日期系统中,比如2007-12-03T10:15:30

机器的日期和时间格式

作为人,我们习惯与以星期几,几号,几点,几分这样的方式理解日期和时间。对于计算机来说,建模时间最自然的格式是表示一个持续时间段上某个点的单一大整型数。这也是新的java.time.Instant类对时间建模的方式,基本上它是以Unix元年时间(传统的设定为UTC时区1970年1月1日午夜时分)开始经历的秒数进行计算。

Duration与Period

以年,月,日方式建模,可以使用Period类。

关于二者其他的api可以对照java api文档进行查看,比较浅显。

ZoneId和ZonedDateTime

新的java.time.ZoneId替代了老版本的java.util.TimeZone.

java8还提供了一些别的日历系统,这些日历系统中的每一个都有一个ThaiBuddhistDate,MinguoDate,JapaneseDate对应的日志类。这边不做介绍。

格式化与解析时间对象DateTimeFormatter

创建格式器最简单的方法是通过DateTimeFormatter的静态工厂方法以及常量。像BASIC_ISO_DATE 和ISO_LOCAL_DATE这 样 的 常 量 是DateTimeFormatter类 的 预 定 义 实 例 。所 有 的 DateTimeFormatter实例都能用于以一定的格式创建代表特定日期或时间的字符串。

和老的java.util.DateFormat相比较,所有的DateTimeFormatter实例都是线程安全的。所以,你能够以单例模式创建格式器实例,就像DateTimeFormatter所定义的那些常量,并能在多个线程间共享这些实例。DateTimeFormatter类还支持一个静态工厂方法,它可以按照某个特定的模式创建格式器.

使用TemporalAdjuster类更精确的操纵日期

使用TemporalAdjuster类更精确的操纵日期,不在局限于一次只能改变它的一个只,并且你还可以按照需求定义自己的日期转换器。

TemporalAdjusters工厂类为我们提供了很多便捷的操作。

next/previous 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星 期几要求的日期。 nextOrSame/previousOrSame 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星 期几要求的日期,如果该日期已经符合要求,直接返回该对象。

总结

java8提供的日期-时间对象是不可变的。操作的结果总是返回一个新的实列,老的日期时间对象不会发生改变。所以提供的这些类都很简单,但是需要我们多去使用它。