Java開源 - Joda-Time:讓日期處理更簡單
簡介
Joda-Time,一個面向 Java 平臺的易于使用的開源時間/日期庫。
Joda-Time可以用來替換JDK的日期處理類,并且比 JDK中的時間類更加優秀。
使用
1、初始化
DateTime 類作為最重要和最核心的一個類,
Joda-Time 為它提供了豐富的初始化方式。
注意:DateTime 一旦創建,時間值將不能更改。所有時間更改的操作會重 新返回一個新的DateTime。
DateTime dateTime;dateTime = new DateTime(); //以當前系統的毫秒級時間構建實例
dateTime = new DateTime(1481006233254L); //以毫秒級時間參數構建實例
dateTime = new DateTime("2016-11-22"); // 以String為參數構造實例
dateTime = new DateTime(2016,12,1,11,22,59); // 以 年.月.日.時.分.秒 構造實例
dateTime = new DateTime(2016,12,1,11,22,59,114); // 以 年.月.日.時.分.秒.毫秒 構造實例
dateTime = new DateTime(new Date()); // 以 JDK中Date為參數構造實例
dateTime = new DateTime(Calendar.getInstance()); // 以 JDK中Calendar為參數構造實例
dateTime = new DateTime(new DateTime()); // 以 DateTime本身為參數構造實例
// 注意:以上的每種實例化方式都可以在最后加上DateTimeZone參數來指定時區。
// 或者加上Chronology參數指定年表。
// 兩個參數都不傳或者傳null,使用默認值
DateTimeFormatter format = DateTimeFormat .forPattern("yyyy-MM-dd HH:mm:ss");
// 通過DateTime的parse方法解析時間
DateTime dateTime = DateTime.parse("2016-12-1 14:22:45", format);</code></pre>
2、格式化輸出
比較復雜的寫法是通過DateTimeFormatter 來格式化:
DateTime dateTime = new DateTime();
// 使用DateTimeFormatter 格式化日期
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd");
// DateTimeFormatter 作為參數傳到toString方法中
String time = dateTime.toString(fmt);
// --> 輸出: 2016-12-06
更加簡便的方式:
// 更簡單的方法
DateTime dateTime = new DateTime();
// toString方法有一個String類型參數的重載
String time = dateTime.toString("yyyy-MM-dd");
// --> 輸出: 2016-12-06
// 既然如此,我們可以更方便輸出更多格式
dateTime.toString("MM/dd/yyyy hh:mm:ss.SSSa");
dateTime.toString("dd-MM-yyyy HH:mm:ss");
dateTime.toString("EEEE dd MMMM, yyyy HH:mm:ssa");
dateTime.toString("MM/dd/yyyy HH:mm ZZZZ");
dateTime.toString("MM/dd/yyyy HH:mm Z");</code></pre>
3、日期的比較
DateTime dateTime = new DateTime("2014-11-22");
DateTime dateTime2 = new DateTime("2014-11-22");
DateTime dateTime3 = new DateTime("2015-12-25");
dateTime.isEqual(dateTime2); // true
dateTime.isBefore(dateTime3); // true
比較的方法有 isEqual isBefore isAfter 。
每個方法對應三種重載,同時還有和當前時間比較的方法:

比較時間的方法
4、日期的操作
-
設置日期
設置日期的方法都是以with開頭
// 初始化一個DateTime
DateTime dateTime = new DateTime("2016-3-31");
dateTime.toString("yyyy-MM-dd hh:mm:ss");//2016-03-31 12:00:00
//將 年 設置為2014。
//前面說過,所有更改時間的操作都會返回新的DateTime
//舊的DateTime 日期值不會改變
DateTime dateTime1 = dateTime.withYear(2014);
dateTime1.toString("yyyy-MM-dd hh:mm:ss");//2014-03-31 12:00:00
設置時間屬性的方法比較多,可以設置年月日、時分秒、時區等等。
基本都是以with開頭,比較直觀。
-
增加日期
增加日期的方法都是以plus 開頭
DateTime dateTime = new DateTime();
dateTime.toString("yyyy-MM-dd hh:mm:ss"); // 2016-12-06 03:15:07
// 當前時間基礎上加上兩天
DateTime dateTime2 = dateTime.plusDays(2);
dateTime2.toString("yyyy-MM-dd hh:mm:ss"); // 2016-12-08 03:15:07
增加日期的方法還有不少,也比較直觀:

增加日期的方法
-
減少日期
減少日期的方法都是以minus開頭
DateTime dateTime = new DateTime();
dateTime.toString("yyyy-MM-dd hh:mm:ss"); //2016-12-06 03:20:45
// 減少五個月,并返回一個新的DateTime
DateTime dateTime2 = dateTime.minusMonths(5);
dateTime2.toString("yyyy-MM-dd hh:mm:ss"); //2016-07-06 03:20:45
更多減少日期方法:

減少日期方法
5、獲取日期屬性
-
get方法獲取
通過get開頭的方法,可以獲取一些常用的屬性
DateTime dateTime = new DateTime("2016-3-31");
int dayOfWeek = dateTime.getDayOfWeek();
Log.i("tag", "3月31是星期:"+dayOfWeek);
// -->3月31是星期:4
更多get方法:

獲取日期屬性
-
使用Property獲取日期屬性
Property是DateTime中的屬性,使用Property可以做一些get方法無法進行的操作。
DateTime dateTime = new DateTime("2016-3-31");
dateTime.dayOfWeek().getAsShortText(Locale.ENGLISH); //Thu
dateTime.dayOfWeek().getAsShortText(Locale.CHINA); //周四
dateTime.dayOfWeek().getAsText(Locale.KOREAN); // ??? (韓語:星期四)
dateTime.dayOfWeek().getAsText(Locale.CHINA); //星期四
// getAsShortText:獲取縮略的文本
// getAsText : 獲取完整的文本</code></pre>
問題:如果我們將 3月31日 減少 1 個月,這個輸出的結果會是什么呢?
結果不可能是2月31日的 , 因為2月不存在31日。
我們運行程序看看結果:
DateTime dateTime = new DateTime("2016-3-31");
Log.i("tag", dateTime.toString("yyyy-MM-dd hh:mm:ss"));
DateTime dateTime1 = dateTime.minusMonths(1);
Log.i("tag", dateTime1.toString("yyyy-MM-dd hh:mm:ss"));

輸出結果
從圖中可以看出DateTime 對這種情況是做了很好處理。