Joda-Time provides a quality replacement for the Java date and time classes.
Joda-Time is the de facto standard date and time library for Java prior to Java SE 8. Users are now asked to migrate to java.time (JSR-310).java
JDK在8以前的版本,對日期時間的處理至關麻煩,有些方法設計很是反人類。而Joda-Time使用起來不只方便,並且可讀性強。雖然JDK 8引用了新的時間處理類,並且參與設計的人也正是Joda-Time的做者,可是因爲各類緣由,不少項目仍是使用的JDK7,使用Joda-Time仍是一個不錯的選擇。安全
對比以前JDK的處理方式,使用了Joda-Time以後,代碼整個神清氣爽了不少。接下來就用一些簡單的例子來對比一下JDk和Joda-Time的的使用。併發
只須要引用一個包。ide
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.3</version> </dependency>
JDK的日期是Date:線程
Date date = new Date();
Joda-Time的日期是DateTime:設計
DateTime dateTime = new DateTime();
DateTime在建立的時候還能夠輕鬆的指定特定的日期和時間:code
DateTime dateTime = new DateTime(2016, 10, 01, 00, 00);
JDK使用的是SimpleDateFormat來進行日期的格式化:orm
Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStr = sdf.format(date);
乍看之下用起來也不麻煩,可是SimpleDateFormat是非線程安全的。也就是說,若是在併發環境下,必須對SimpleDateFormat對象作同步處理,好比用synchronized,好比用ThreadLocal;或者每次都new一個新的SimpleDateFormat對象,缺點顯而易見,就是浪費資源。xml
而Joda-Time中的DateTime自己就有格式化的方法,對象直接調用便可:對象
DateTime dateTime = new DateTime(); String dateTimeStr = dateTime.toString("yyyy-MM-dd HH:mm:ss");
固然,若是要用轉換器,Joda-Time也提供了DateTimeFormatter:
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); String dateTimeStr = dtf.print(dateTime);
並且DateTimeFormatter是不可變的,因此是線程安全的。
SimpleDateFormat和DateTimeFormatter也均可以將字符串轉換成日期:
String dateStr = "2016-09-22"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = sdf.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); } DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd"); DateTime dateTime = dtf.parseDateTime(dateStr);
我的在Joda-Time使用中,最喜歡的是它的日期計算。
好比要獲得40天前的日期,在JDK中,計算日期至關複雜,必須藉助日曆Calendar來完成:
Date today = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(today); // 設置日曆 calendar.add(Calendar.DAY_OF_MONTH, -40); // 將日曆往回翻40天 Date beforeDay = calendar.getTime(); // 日曆返回日期
Joda-Time中,日期自帶日期計算功能,很是直觀:
DateTime today = new DateTime(); DateTime beforeDay = today.minusDays(40);
若是要計算兩個日期相差的天數,使用JDK是這樣實現的:
int diffDays = (int) ((today.getTime() - beforeDay.getTime()) / (24*60*60*1000));
Joda-Time提供了相關的方法來處理:
int diffDays = Days.daysBetween(yesterday, today).getDays();
除了天數,月數、年數計算起來都很是方便,好比月數:
int diffMonths = Months.monthsBetween(yesterday, today).getMonths();
Joda-Time另外一個使用起來很是方便的地方就是與JDK日期類的互相轉換。由於不少現成的接口多是用JDk的日期做爲入參或者出參,若是Joda-Time不能兼容,那不少方便就不復存在了。
// Date to DateTime Date date = new Date(); DateTime dateTime = new DateTime(date); // DateTime to Date Date date2 = dateTime.toDate(); // Calendar to DateTime Calendar calender = Calendar.getInstance(); DateTime dateTime2 = new DateTime(calender); // DateTime to Calendar Calendar calendar2 = dateTime.toCalendar(Locale.CHINA);