Joda Time

一、Joda Time基礎(chǔ)操作#

1瞧哟、 構(gòu)造指定時(shí)間#

// 明確給出年月日時(shí)分秒,同時(shí)還可以指定毫秒
DateTime dateTime = new DateTime(2017,9,14,20,30,0);  

// 使用時(shí)間戳構(gòu)造
Datetime dateTime = new DateTime(1505371053358L);

// 使用字符串構(gòu)造迫筑,使用字符串構(gòu)造需要自己定義pattern
String date = "2017-09-14 20:30:00";
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dateTime = dateTimeFormatter.parseDateTime(date);

// 指定時(shí)區(qū)構(gòu)造時(shí)間
DateTime dateTime = new DateTime(DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Shanghai")));

注意:”Asia/Shanghai”是國(guó)際時(shí)區(qū)Id规惰,該ID可以通過(guò)JDK代碼獲取丹弱,代碼如下:
String[] zones = TimeZone.getAvailableIDs();
for (String zone : zones) {
System.out.println(zone);
}

2氮帐、獲取當(dāng)前時(shí)間的時(shí)間戳#

// JDK
long currentTimeOfMills = System.currentTimeMillis();
// Joda Time
long currentTimeOfMills = DateTime.now().getMillis();

3隘截、獲得當(dāng)前時(shí)間的時(shí)區(qū)#

DateTimeZone zone = DateTime.now().getZone();

4扎阶、 獲取指定時(shí)區(qū)的當(dāng)前時(shí)間#

<p
DateTimeZone gmt = DateTimeZone.forID("GMT"); DateTime dateTime = DateTime.now().toDateTime(gmt); </pre>

二汹胃、Joda Time 對(duì)年月日的一些簡(jiǎn)單操作。#

1东臀、 獲取月初第一天和月末最后一天#

DateTime dateTime = new DateTime();
// 月初第一天
DateTime theFirstDateOfMonth = dateTime.dayOfMonth().withMinimumValue();
//  當(dāng)前月最后一天
DataTime theEndDataOfMonth = dateTime.dayOfMonth().withMaximumValue();

// 這一天是幾號(hào)
int day = dateTime.getDayOfMonth();
// 這一天是哪月
int month = dateTime.getMothOfYear();
// 這一天是哪年
int year = dateTime.getYear();
// 判斷本月是不是9月
if(dateTime.getDayOfMonth() == DateTimeConstants.SEPTEMBER){
//TODO
}

// 獲取相對(duì)于當(dāng)前時(shí)間的月份着饥,比如獲取上個(gè)月的時(shí)間或者下個(gè)月的是時(shí)間,方法minusMoths接受一個(gè)int的參數(shù)惰赋,如果這個(gè)參數(shù)等于0宰掉,代表本月,大于0代表已經(jīng)過(guò)去的時(shí)間赁濒,小于0代表還沒(méi)有到來(lái)的時(shí)間
 LocalDate lastDayOfMonth = new LocalDate().minusMonths(1).dayOfMonth().withMaximumValue();

2轨奄、關(guān)于星期的操作#

DateTime dateTime = new DateTime();
// 今天是星期幾
int week = dateTime.getDayOfWeek();
// 判斷今天是不是星期三
if(dateTime.getDayOfWeek() == DateTimeConstants.WEDNESDAY){
    // TODO
}

注意:DateTimeConstants中包含了許多你需要的常量,而不用你自己去定義流部,比如星期戚绕、月份、上午還是下午都有哦

3枝冀、計(jì)算時(shí)間差#

注意開(kāi)始時(shí)間與結(jié)束時(shí)間參數(shù)位置舞丛,如果開(kāi)始時(shí)間小于結(jié)束時(shí)間,得到的天數(shù)是正數(shù)果漾,否則就是負(fù)數(shù)哦球切!

DateTime currentDateTime = new DateTime();
DateTime targetDateTime = new DateTime(2017,10,1,0,0,0);

// 相差多少年
int years = Years.yearsBetween(currentDateTime,targetDateTime).getYears();
// 相差多少月
int months = Months.monthsBetween(currentDateTime,targetDateTime).getMonths();
// 距離國(guó)慶放假還有多少天,嘎嘎绒障!
int days = Days.daysBetween(currentDateTime,targetDateTime).getDays();
// 相差多少小時(shí)
int hours = Hours.hoursBetween(currentDateTime,targetDateTime).getHours();
// 相差多少分鐘
int minutes = Minutes.minutesBetween(currentDateTime,targetDateTime).getMinutes();
// 相差多少秒
int seconds = Seconds.secondsBetween(currentDateTime,targetDateTime).getSeconds();
// 相差多少周
int weeks = Weeks.weeksBetween(currentDateTime,targetDateTime).getWeeks();

4吨凑、獲取零點(diǎn)相關(guān)的時(shí)間#

DateTime currentDateTime = new DateTime();
// 今天的零點(diǎn)
DateTime dateTime = currentDateTime.withMillisOfDay(0);
// 昨天的零點(diǎn)
DateTime dateTime = currentDateTime.withMillisOfDay(0).plusDays(-1);
// 明天的零點(diǎn)
DateTime dateTime = currentDateTime.withMillisOfDay(0).plusDays(1);
// 這一年最后一天0點(diǎn)
new DateTime().dayOfYear().withMaximumValue().withMillisOfDay(0)
// 這一年第一天0點(diǎn)
new DateTime().dayOfYear().withMinimumValue().withMillisOfDay(0)
// 這個(gè)月最后一天0點(diǎn)
new DateTime().dayOfMonth().withMaximumValue().withMillisOfDay(0)
// 這個(gè)月月初0點(diǎn)
new DateTime().dayOfMonth().withMinimumValue().withMillisOfDay(0)

注意:要獲取多少天后或者多少天前的零點(diǎn)户辱,只需在plusDays()方法中填寫(xiě)相應(yīng)參數(shù)即可

三鸵钝、準(zhǔn)確使用Joda Time的時(shí)間處理類(lèi)#

1、格式化就這么簡(jiǎn)單#

// 格式化時(shí)間
DateTime currentDateTime = new DateTime();
currentDateTime.toString("yyyy-MM-dd HH:mm:ss");

// 指定時(shí)區(qū)格式化
String format = "yyyy-MM-dd HH:mm:ss";
DateTime dateTime = new DateTime();
dateTime.toString(format, Locale.US);

// 格式化時(shí)分秒(單位毫秒并且最大可格式23:59:59庐镐,超出將報(bào)錯(cuò))
int millis = 120000;
LocalTime localTime = new LocalTime().withMillisOfDay(millis);
localTime.toString("HH:mm:ss");

2恩商、 如果業(yè)務(wù)只需要日期,請(qǐng)使用LocalDate,因?yàn)長(zhǎng)ocalDate僅僅關(guān)心日期必逆,更專(zhuān)業(yè)怠堪,也減少了不必要的資源消耗;如果業(yè)務(wù)只關(guān)心時(shí)間名眉,那么使用LocalTime粟矿。例如:#

LocalDate localDate = new LocalDate();
LocalTime localTime = new LocalTime();
System.out.println(localDate);
// 2017-09-14
System.out.println(localTime);
//10:54:14.506

3、 如果業(yè)務(wù)需要日期時(shí)間都要使用损拢,那么可以使用LocalDateTime, DateTime這兩個(gè)類(lèi)陌粹,它們都是線程安全的同時(shí)都是不可變的,使用起來(lái)不用擔(dān)心出問(wèn)題福压。#

LocalDateTime是與時(shí)區(qū)無(wú)關(guān)的申屹。
DateTime是與時(shí)區(qū)相關(guān)的一個(gè)國(guó)際標(biāo)準(zhǔn)時(shí)間绘证。
使用的時(shí)候根據(jù)自己的需要選擇,詳細(xì)的解釋看官方文檔吧哗讥!

4嚷那、再次提醒要使用DateTimeConstants類(lèi)定義好的常量,避免重復(fù)造輪子杆煞。下面給出DateTimeConstants類(lèi)的常量(也不多)魏宽,不在解釋?zhuān)x。#

// 月份
public static final int JANUARY = 1;
public static final int FEBRUARY = 2;
public static final int MARCH = 3;
public static final int APRIL = 4;
public static final int MAY = 5;
public static final int JUNE = 6;
public static final int JULY = 7;
public static final int AUGUST = 8;
public static final int SEPTEMBER = 9;
public static final int OCTOBER = 10;
public static final int NOVEMBER = 11;
public static final int DECEMBER = 12;
// 星期
public static final int MONDAY = 1;
public static final int TUESDAY = 2;
public static final int WEDNESDAY = 3;
public static final int THURSDAY = 4;
public static final int FRIDAY = 5;
public static final int SATURDAY = 6;
public static final int SUNDAY = 7;
// 上午&下午
public static final int AM = 0;
public static final int PM = 1;
// 公元前...年(基督之前...年)
public static final int BC = 0;
// 公元前
public static final int BCE = 0;
// 公元...年(原義為主的紀(jì)年)
public static final int AD = 1;
// 基督紀(jì)元,公元
public static final int CE = 1;
// 1秒對(duì)應(yīng)毫秒數(shù)
public static final int MILLIS_PER_SECOND = 1000;
// 1分鐘對(duì)應(yīng)秒數(shù)
public static final int SECONDS_PER_MINUTE = 60;
// 1分鐘對(duì)應(yīng)毫秒數(shù)
public static final int MILLIS_PER_MINUTE = 60000;
// 1小時(shí)對(duì)應(yīng)分鐘數(shù)
public static final int MINUTES_PER_HOUR = 60;
// 1小時(shí)對(duì)應(yīng)的秒數(shù)
public static final int SECONDS_PER_HOUR = 3600;
// 1小時(shí)對(duì)應(yīng)的毫秒數(shù)
public static final int MILLIS_PER_HOUR = 3600000;
// 1天對(duì)應(yīng)的小時(shí)
public static final int HOURS_PER_DAY = 24;
// 1天對(duì)應(yīng)的分鐘數(shù)
public static final int MINUTES_PER_DAY = 1440;
// 1天對(duì)應(yīng)的秒數(shù)
public static final int SECONDS_PER_DAY = 86400;
// 1天對(duì)應(yīng)的毫秒數(shù)
public static final int MILLIS_PER_DAY = 86400000;
// 1周對(duì)應(yīng)的天數(shù)
public static final int DAYS_PER_WEEK = 7;
// 1周對(duì)應(yīng)的小時(shí)
public static final int HOURS_PER_WEEK = 168;
// 1周對(duì)應(yīng)的分鐘
public static final int MINUTES_PER_WEEK = 10080;
// 1周對(duì)應(yīng)的秒數(shù)
public static final int SECONDS_PER_WEEK = 604800;
// 1周對(duì)應(yīng)的毫秒數(shù)
public static final int MILLIS_PER_WEEK = 604800000;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末决乎,一起剝皮案震驚了整個(gè)濱河市队询,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌构诚,老刑警劉巖蚌斩,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異范嘱,居然都是意外死亡送膳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)丑蛤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叠聋,“玉大人,你說(shuō)我怎么就攤上這事受裹÷挡梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵棉饶,是天一觀的道長(zhǎng)厦章。 經(jīng)常有香客問(wèn)我,道長(zhǎng)照藻,這世上最難降的妖魔是什么袜啃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮岩梳,結(jié)果婚禮上囊骤,老公的妹妹穿的比我還像新娘晃择。我一直安慰自己冀值,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布宫屠。 她就那樣靜靜地躺著列疗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浪蹂。 梳的紋絲不亂的頭發(fā)上抵栈,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天告材,我揣著相機(jī)與錄音,去河邊找鬼古劲。 笑死斥赋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的产艾。 我是一名探鬼主播疤剑,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼闷堡!你這毒婦竟也來(lái)了隘膘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤杠览,失蹤者是張志新(化名)和其女友劉穎弯菊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體踱阿,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡管钳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扫茅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹋嵌。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖葫隙,靈堂內(nèi)的尸體忽然破棺而出栽烂,到底是詐尸還是另有隱情,我是刑警寧澤恋脚,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布腺办,位于F島的核電站,受9級(jí)特大地震影響糟描,放射性物質(zhì)發(fā)生泄漏怀喉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一船响、第九天 我趴在偏房一處隱蔽的房頂上張望躬拢。 院中可真熱鬧,春花似錦见间、人聲如沸聊闯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)菱蔬。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拴泌,已是汗流浹背魏身。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚪腐,地道東北人箭昵。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像回季,于是被迫代替她去往敵國(guó)和親宙枷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345