簡(jiǎn)介
Joda-Time,一個(gè)面向 Java 平臺(tái)的易于使用的開源時(shí)間/日期庫(kù)。
Joda-Time可以用來(lái)替換JDK的日期處理類,并且比 JDK中的時(shí)間類更加優(yōu)秀。
地址
GitHub:https://github.com/JodaOrg/joda-time
官網(wǎng):http://www.joda.org/joda-time/
Gradle: compile 'joda-time:joda-time:2.9.6'
使用
1、初始化
DateTime 類作為最重要和最核心的一個(gè)類,
Joda-Time 為它提供了豐富的初始化方式。
注意:DateTime 一旦創(chuàng)建,時(shí)間值將不能更改。所有時(shí)間更改的操作會(huì)重 新返回一個(gè)新的DateTime。
DateTime dateTime;dateTime = new DateTime(); //以當(dāng)前系統(tǒng)的毫秒級(jí)時(shí)間構(gòu)建實(shí)例
dateTime = new DateTime(1481006233254L); //以毫秒級(jí)時(shí)間參數(shù)構(gòu)建實(shí)例
dateTime = new DateTime("2016-11-22"); // 以String為參數(shù)構(gòu)造實(shí)例
dateTime = new DateTime(2016,12,1,11,22,59); // 以 年.月.日.時(shí).分.秒 構(gòu)造實(shí)例
dateTime = new DateTime(2016,12,1,11,22,59,114); // 以 年.月.日.時(shí).分.秒.毫秒 構(gòu)造實(shí)例
dateTime = new DateTime(new Date()); // 以 JDK中Date為參數(shù)構(gòu)造實(shí)例
dateTime = new DateTime(Calendar.getInstance()); // 以 JDK中Calendar為參數(shù)構(gòu)造實(shí)例
dateTime = new DateTime(new DateTime()); // 以 DateTime本身為參數(shù)構(gòu)造實(shí)例
// 注意:以上的每種實(shí)例化方式都可以在最后加上DateTimeZone參數(shù)來(lái)指定時(shí)區(qū)。
// 或者加上Chronology參數(shù)指定年表。
// 兩個(gè)參數(shù)都不傳或者傳null,使用默認(rèn)值
DateTimeFormatter format = DateTimeFormat .forPattern("yyyy-MM-dd HH:mm:ss");
// 通過DateTime的parse方法解析時(shí)間
DateTime dateTime = DateTime.parse("2016-12-1 14:22:45", format);
2、格式化輸出
比較復(fù)雜的寫法是通過DateTimeFormatter 來(lái)格式化:
DateTime dateTime = new DateTime();
// 使用DateTimeFormatter 格式化日期
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd");
// DateTimeFormatter 作為參數(shù)傳到toString方法中
String time = dateTime.toString(fmt);
// --> 輸出: 2016-12-06
更加簡(jiǎn)便的方式:
// 更簡(jiǎn)單的方法
DateTime dateTime = new DateTime();
// toString方法有一個(gè)String類型參數(shù)的重載
String time = dateTime.toString("yyyy-MM-dd");
// --> 輸出: 2016-12-06
// 既然如此,我們可以更方便輸出更多格式
dateTime.toString("MM/dd/yyyy hh:mm:ss.SSS");
dateTime.toString("dd-MM-yyyy HH:mm:ss");
dateTime.toString("EEEE dd MMMM, yyyy HH:mm:ss");
dateTime.toString("MM/dd/yyyy HH:mm ZZZZ");
dateTime.toString("MM/dd/yyyy HH:mm Z");
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 。
每個(gè)方法對(duì)應(yīng)三種重載,同時(shí)還有和當(dāng)前時(shí)間比較的方法:
4、日期的操作
- 設(shè)置日期
設(shè)置日期的方法都是以with開頭
// 初始化一個(gè)DateTime
DateTime dateTime = new DateTime("2016-3-31");
dateTime.toString("yyyy-MM-dd hh:mm:ss");//2016-03-31 12:00:00
//將 年 設(shè)置為2014。
//前面說過,所有更改時(shí)間的操作都會(huì)返回新的DateTime
//舊的DateTime 日期值不會(huì)改變
DateTime dateTime1 = dateTime.withYear(2014);
dateTime1.toString("yyyy-MM-dd hh:mm:ss");//2014-03-31 12:00:00
設(shè)置時(shí)間屬性的方法比較多,可以設(shè)置年月日、時(shí)分秒、時(shí)區(qū)等等。
基本都是以with開頭,比較直觀。
更多細(xì)節(jié)可以參考官方文檔
- 增加日期
增加日期的方法都是以plus 開頭
DateTime dateTime = new DateTime();
dateTime.toString("yyyy-MM-dd hh:mm:ss"); // 2016-12-06 03:15:07
// 當(dāng)前時(shí)間基礎(chǔ)上加上兩天
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
// 減少五個(gè)月,并返回一個(gè)新的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方法無(wú)法進(jìn)行的操作。
DateTime dateTime = new DateTime("2016-3-31");
dateTime.dayOfWeek().getAsShortText(Locale.ENGLISH); //Thu
dateTime.dayOfWeek().getAsShortText(Locale.CHINA); //周四
dateTime.dayOfWeek().getAsText(Locale.KOREAN); // ??? (韓語(yǔ):星期四)
dateTime.dayOfWeek().getAsText(Locale.CHINA); //星期四
// getAsShortText:獲取縮略的文本
// getAsText : 獲取完整的文本
問題:如果我們將 3月31日 減少 1 個(gè)月,這個(gè)輸出的結(jié)果會(huì)是什么呢?
結(jié)果不可能是2月31日的 , 因?yàn)?月不存在31日。
我們運(yùn)行程序看看結(jié)果:
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 對(duì)這種情況是做了很好處理。
更多介紹參考用戶手冊(cè)
-- end --