简介
Joda-Time 令时间和日期值变得易于管理、操作和理解。事实上,易于使用是 Joda 的主要设计目标。其他目标包括可扩展性、完整的特性集以及对多种日历系统的支持。并且 Joda 与 JDK 是百分之百可互操作的,因此您无需替换所有 Java 代码,只需要替换执行日期/时间计算的那部分代码。本文主要就JDK date calendar 与 jodatime 对比。
一 、Joda-Time使用说明
创建DateTime对象
1 | //方法一 |
创建LocalDate,LocalTime对象
LocalDate:该类封装了一个年/月/日的组合。当地理位置(即时区)变得不重要时,使用它存储日期将非常方便。例如,某个特定对象的出生日期 可能为 1999 年 4 月 16 日,但是从技术角度来看,在保存所有业务值的同时不会了解有关此日期的任何其他信息(比如这是一周中的星期几,或者这个人出生地所在的时区)。在这种情况下,应当使用 LocalDate。
1 | //方法一 |
LocalTime:这个类封装一天中的某个时间,当地理位置不重要的情况下,可以使用这个类来只存储一天当中的某个时间。例如,晚上 11:52 可能是一天当中的一个重要时刻(比如,一个 cron 任务将启动,它将备份文件系统的某个部分),但是这个时间并没有特定于某一天,因此我不需要了解有关这一时刻的其他信息。
1 | //方法一 |
二、Joda处理时间
日期计算
例1:计算上一个月的最后一天?
1 | LocalDate now = SystemFactory.getClock().getLocalDate(); |
- yearOfCentury
- dayOfYear
- monthOfYear
- dayOfMonth
- dayOfWeek
例2:获得任何一年中的第 11 月的第一个星期二的日期,而这天必须是在这个月的第一个星期一之后?
1
2
3
4
5
6
7
8
9LocalDate now = SystemFactory.getClock().getLocalDate();
LocalDate electionDate = now.monthOfYear()
.setCopy(11) // November
.dayOfMonth() // Access Day Of Month Property
.withMinimumValue() // Get its minimum value
.plusDays(6) // Add 6 days
.dayOfWeek() // Access Day Of Week Property
.setCopy("Monday") // Set to Monday (it will round down)
.plusDays(1); // Gives us Tuesday
例2注释帮助您了解代码如何获得结果。.setCopy(“Monday”) 是整个计算的关键。不管中间 LocalDate 值是多少,将其 dayOfWeek 属性设置为 Monday 总是能够四舍五入,这样的话,在每月的开始再加上 6 天就能够让您得到第一个星期一。再加上一天就得到第一个星期二。Joda 使得执行此类计算变得非常容易。
例3 :计算从现在开始经过两个星期之后的日期
1 | DateTime now = SystemFactory.getClock().getDateTime(); |
例4:计算从明天起 90 天以后的日期
1 | DateTime now = SystemFactory.getClock().getDateTime(); |
例5: 计算从现在起 156 秒之后的时间
1 | DateTime now = SystemFactory.getClock().getDateTime(); |
例6:计算五年后的第二个月的最后一天
1 | DateTime now = SystemFactory.getClock().getDateTime(); |
三 、Joda 和 JDK 互操作性
从 Joda DateTime 类创建 JDK 类
1 | DateTime dateTime = SystemFactory.getClock().getDateTime(); |
从 Joda LocalDate 类创建 JDK 类
1 | LocalDate localDate = SystemFactory.getClock().getLocalDate(); |
JDK 对象转换为Joda对象
1 | java.util.Date jdkDate = obtainDateSomehow(); |
将不同对象传递给 DateTime 的构造函数
1 | // Use a Calendar |
以 Joda 方式格式化时间
使用了 ISODateTimeFormat 的静态方法
1 | DateTime dateTime = SystemFactory.getClock().getDateTime(); |
传递 SimpleDateFormat 字符串
1 | DateTime dateTime = SystemFactory.getClock().getDateTime(); |
四、对比例子
1、初始化某个瞬间的对象(除 “现在” 以外)并加上特定天数
- JDK
1
2
3
4
5Calendar calendar = Calendar.getInstance();
calendar.set(2000, Calendar.JANUARY, 1, 0, 0, 0);
SimpleDateFormat sdf = new SimpleDateFormat("E MM/dd/yyyy HH:mm:ss.SSS");
calendar.add(Calendar.DAY_OF_MONTH, 90);
System.out.println(sdf.format(calendar.getTime()));
*Joda1
2DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0);
System.out.println(dateTime.plusDays(90).toString("E MM/dd/yyyy HH:mm:ss.SSS");
2、距离 2000年1月1日 45 天之后的某天在下一个月的当前周的最后一天的日期
- Joda
1
2
3DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0);
System.out.println(dateTime.plusDays(45).plusMonths(1).dayOfWeek()
.withMaximumValue().toString("E MM/dd/yyyy HH:mm:ss.SSS");
结果
Sun 03/19/2000 00:00:00.000
文章参考: https://www.ibm.com/developerworks/cn/java/j-jodatime.html
