注意如果使用 Java SE 8 及以上,建议使用 java.time
(JSR-210) 来代替使用 Joda-time。
Java 中日期,时间处理类库 Joda time
依赖
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.2</version>
</dependency>
最新的版本官网查看 1
使用
5 个最常用的 date-time 类:
- Instant - Immutable Class,用来表示时间轴上一个瞬时的点
- DateTime - Immutable Class,用来替换 JDK 的 Calendar 类
- LocalDate - Immutable Class,表示一个本地的日期,而不包含时间部分(没有时区信息), 适合表示出生日期
- LocalTime - Immutable Class,表示一个本地的时间,而不包含日期部分(没有时区信息), 适合表示商店的每天开门 / 关门时间
- LocalDateTime - Immutable Class,表示一个本地的日期-时间(没有时区信息)
Instant
表示时刻,瞬时的时间
Interval
表示时间间隔,是一个半开区间,包括开始时刻,但不包括结束时刻。结束时刻永远要大于或者等于开始时刻。有两个实现 Interval 和 MutableInterval
Duration
表示持续时间,用 milliseconds 表示,duration 通常从 interval 中获取。
instant + duration = instant
Period
一段时间,通常比如三年五个月两天 7 小时。他和 Duration 的区别在于,Period 是不精确的(在 milliseconds 级别)。比如有一个月的时间段,那么在二月一号加上一个月会得到三月一号,而在三月一号加上一个月,会得到四月一号,但是这两个 duration(in milliseconds)是完全不一样的。
instant + period = instant
有两个实现 Period 和 MutablePeriod
DateTime
有很多构造方法
DateTime dateTime1 = new DateTime();
DateTime dateTime2 = new DateTime(2015,11,11,0,0,0);
DateTime dateTime3 = new DateTime(1447171200000L);
DateTime dateTime4 = new DateTime(new Date());
DateTime dateTime5 = new DateTime("2015-11-11T00:00:00.000+08:00");
LocalTime
Joda Time 中的 LocalTime 表示的是一个没有日期的时间
常用方法
LocalTime.now()
Interval 和 Period
Joda-Time 为时间段的表示提供了支持。
- Interval:保存了一个开始时刻和一个结束时刻,因此能够表示一段时间,并进行这段时间的相应操作
- Period:保存了一段时间,比如:6 个月,3 天,7 小时这样的概念。可以直接创建 Period,或者从 Interval 对象构建。
- Duration:保存了一个精确的毫秒数。同样地,可以直接创建 Duration,也可以从 Interval 对象构建。
JDK8 中的时间相关
因为 Joda Time 非常稳定可靠,在 JDK 8 以前成为了 Java 处理时间相关的事实标准,JDK 8 中引入了 java.time
等一组新 api 用来处理时间日期,遵守 JSR 310,弥补了 Java 在时间处理方面的不足。Joda-Time 的作者 Stephen Colebourne 和 Oracle 一起共同参与了这些 API 的设计和实现。
JDK 8 以前 Date 和 Calendar 类存在的问题:
- 非线程安全,需要额外的代码来处理线程安全问题
- 接口设计,之前的接口处理 day-to-day 操作困难
- 时区相关时间,需要额外处理
相关类:
- Instant 时刻
- Duration
- LocalDate 日期,2015-01-01
- LocalTime 时间
- LocalDateTime 日期和时间 2015-01-01T14:02:43.455
基本上他们的接口定义都是 ofXX 来构造一个实例,而通过 parseXX 来将一个现有的时间戳转变成对应的实例。
reference
- https://www.joda.org/joda-time/quickstart.html
- https://www.joda.org/joda-time/userguide.html
- https://www.baeldung.com/java-8-date-time-intro
-
https://mvnrepository.com/artifact/joda-time/joda-time ↩