为何要使用 Joda?考虑建立一个用时间表示的某个随意的时刻 — 好比,2000 年 1 月 1 日 0 时 0 分。我如何建立一个用时间表示这个瞬间的 JDK 对象?使用 java.util.Date
?事实上这是行不通的,由于自 JDK 1.1 以后的每一个 Java 版本的 Javadoc 都声明应当使用 java.util.Calendar
。Date
中不同意使用的构造函数的数量严重限制了您建立此类对象的途径。java
然而,Date
确实有一个构造函数,您能够用来建立用时间表示某个瞬间的对象(除 “如今” 之外)。该方法使用距离 1970 年 1 月 1 日子时格林威治标准时间(也称为 epoch)以来的毫秒数做为一个参数,对时区进行校订。考虑到 Y2K 对软件开发企业的重要性,您可能会认为我已经记住了这个值 — 可是我没有。Date
也不过如此。函数
那么 Calendar
又如何呢?我将使用下面的方式建立必需的实例:spa
Calendar calendar = Calendar.getInstance(); calendar.set(2000, Calendar.JANUARY, 1, 0, 0, 0);
使用 Joda,代码应该相似以下所示:code
DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0);
这一行简单代码没有太大的区别。可是如今我将使问题稍微复杂化。假设我但愿在这个日期上加上 90 天并输出结果。使用 JDK,我须要使用清单 1 中的代码:orm
清单 1. 以 JDK 的方式向某一个瞬间加上 90 天并输出结果对象
Calendar 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()));
使用 Joda,代码如清单 2 所示:开发
DateTime 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");
二者之间的差距拉大了(Joda 用了两行代码,JDK 则是 5 行代码)。get
如今假设我但愿输出这样一个日期:距离 Y2K 45 天以后的某天在下一个月的当前周的最后一天的日期。坦白地说,我甚至不想使用 Calendar
处理这个问题。使用 JDK 实在太痛苦了,即便是简单的日期计算,好比上面这个计算。正是多年前的这样一个时刻,我第一次领略到 Joda-Time 的强大。it
……form