Java 8中處理日期和時(shí)間示例

https://www.rjkf.cn/java8-date-localdate/

作者:陶清清

鏈接:http://www.reibang.com/p/2949db9c3df5

來源:簡(jiǎn)書

----------------------------------------------------------------------------------------

在Java 8以前廉侧,日期和時(shí)間處理一直被廣大java程序員抱怨太難用看幼,首先是java.util和java.sql中仅父,都包含Date類,如果要進(jìn)行時(shí)間格式化专控,還需要java.text.DateFormat類處理。同時(shí)java.util.Date中既包含了日期,又包含了時(shí)間翔烁,所以java8新的日期和時(shí)間庫,很好的解決了以前日期和時(shí)間類的很多弊端旨涝。并且也借鑒了第三方日期庫joda很多的優(yōu)點(diǎn)蹬屹。

在java8中,java.time包下主要包含下面幾個(gè)主要的類:

Instant:時(shí)間戳Duration:持續(xù)時(shí)間白华,時(shí)間差LocalDate:只包含日期慨默,比如:2016-10-20LocalTime:只包含時(shí)間,比如:23:12:10LocalDateTime:包含日期和時(shí)間弧腥,比如:2016-10-2023:14:21Period:時(shí)間段ZoneOffset:時(shí)區(qū)偏移量厦取,比如:+8:00ZonedDateTime:帶時(shí)區(qū)的時(shí)間Clock:時(shí)鐘,比如獲取目前美國紐約的時(shí)間

以及java.time.format包中的

DateTimeFormatter:時(shí)間格式化

下面我們通過例子來看如何使用java8新的日期時(shí)間庫

1管搪、獲取今天的日期

LocalDate todayDate = LocalDate.now();System.out.println("今天的日期:"+todayDate);//結(jié)果今天的日期:2016-10-20

2虾攻、指定日期,進(jìn)行相應(yīng)操作

//取2016年10月的第1天LocalDate firstDay = oneday.with(TemporalAdjusters.firstDayOfMonth());System.out.println(firstDay);//取2016年10月的第1天更鲁,另外一種寫法LocalDate firstDay2 = oneday.withDayOfMonth(1);System.out.println(firstDay2);//取2016年10月的最后1天霎箍,不用考慮大月,小月澡为,平年漂坏,閏年LocalDate lastDay = oneday.with(TemporalAdjusters.lastDayOfMonth());System.out.println(lastDay);//當(dāng)前日期+1天LocalDate tomorrow = oneday.plusDays(1);System.out.println(tomorrow);//判斷是否為閏年booleanisLeapYear = tomorrow.isLeapYear();System.out.println(isLeapYear);//運(yùn)行結(jié)果2016-10-202016-10-012016-10-012016-10-312016-10-21true

3、生日檢查或者賬單日檢查

開發(fā)過程中媒至,經(jīng)常需要為過生日的用戶送上一些祝福顶别,例如,用戶的生日為1990-10-12塘慕,如果今天是2016-10-12筋夏,那么今天就是用戶的生日(按公歷/身份證日期來算),那么通過java8新的日期庫图呢,我們?cè)撊绾蝸磉M(jìn)行判斷条篷?

在java8中骗随,可以使用MonthDay,該類不包含年份信息赴叹,當(dāng)然還有一個(gè)類是YearMonth

LocalDate birthday = LocalDate.of(1990,10,12);MonthDay birthdayMd = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());MonthDay today = MonthDay.from(LocalDate.of(2016,10,12));? ? ? ? System.out.println(today.equals(birthdayMd));//結(jié)果true

4鸿染、獲取當(dāng)前的時(shí)間

日期主要是使用LocalTime,該類不包含日期乞巧,只有時(shí)間信息

//獲取當(dāng)前的時(shí)間LocalTime nowTime = LocalTime.now();//結(jié)果14:29:40.558//如果不想顯示毫秒LocalTime nowTime2 = LocalTime.now().withNano(0);//14:43:14//指定時(shí)間LocalTime time = LocalTime.of(14,10,21);//14:10:21LocalTime time2 = LocalTime.parse("12:00:01");// 12:00:01//當(dāng)前時(shí)間增加2小時(shí)LocalTime nowTimePlus2Hour = nowTime.plusHours(2);//16:47:23.144//或者LocalTime nowTimePlus2Hour2 = nowTime.plus(2, ChronoUnit.HOURS);

5涨椒、日期前后比較

比較2個(gè)日期哪個(gè)在前,哪個(gè)在后绽媒,java8 LocalDate提供了2個(gè)方法蚕冬,isAfter(),isBefore

LocalDate today = LocalDate.now();LocalDate specifyDate = LocalDate.of(2015,10,20);System.out.println(today.isAfter(specifyDate));//true

6、處理不同時(shí)區(qū)的時(shí)間

java8中是辕,將日期囤热,時(shí)間,時(shí)區(qū)都很好的進(jìn)行了分離获三。

//查看當(dāng)前的時(shí)區(qū)ZoneId defaultZone = ZoneId.systemDefault();System.out.println(defaultZone);//Asia/Shanghai//查看美國紐約當(dāng)前的時(shí)間ZoneId america = ZoneId.of("America/New_York");LocalDateTime shanghaiTime = LocalDateTime.now();LocalDateTime americaDateTime = LocalDateTime.now(america);System.out.println(shanghaiTime);//2016-11-06T15:20:27.996System.out.println(americaDateTime);//2016-11-06T02:20:27.996 旁蔼,可以看到美國與北京時(shí)間差了13小時(shí)//帶有時(shí)區(qū)的時(shí)間ZonedDateTime americaZoneDateTime = ZonedDateTime.now(america);System.out.println(americaZoneDateTime);//2016-11-06T02:23:44.863-05:00[America/New_York]

7、比較兩個(gè)日期之前時(shí)間差

在項(xiàng)目中疙教,經(jīng)常需要比較兩個(gè)日期之間相差幾天棺聊,或者相隔幾個(gè)月,我們可以使用java8的Period來進(jìn)行處理贞谓。

LocalDate today = LocalDate.now();LocalDate specifyDate = LocalDate.of(2015,10,2);Period period = Period.between(specifyDate, today);System.out.println(period.getDays());//4System.out.println(period.getMonths());//1System.out.println(specifyDate.until(today, ChronoUnit.DAYS));//401//輸出結(jié)果41401

我們可以看到限佩,我們使用Period類比較天數(shù),比較奇怪经宏,他返回的值犀暑,并不是2個(gè)日期之間總共的天數(shù)差,而是一個(gè)相對(duì)天數(shù)差烁兰,比如,5月1日徊都,和10月2日沪斟,他比較的是僅僅2個(gè)天之間的差,那1號(hào)和2號(hào)暇矫,相差1天主之,而實(shí)際上,因?yàn)橹虚g相差了好幾個(gè)月李根,所以真正的天數(shù)差肯定不是1天槽奕,所以我們可以使用until,并指明精度單位是days房轿,就可以計(jì)算真正的天數(shù)差了粤攒。

8所森、日期時(shí)間格式解析、格式化

在java8之前夯接,我們進(jìn)行時(shí)間格式化主要是使用SimpleDateFormat焕济,而在java8中,主要是使用DateTimeFormatter,java8中盔几,預(yù)定義了一些標(biāo)準(zhǔn)的時(shí)間格式晴弃,我們可以直接將時(shí)間轉(zhuǎn)換為標(biāo)準(zhǔn)的時(shí)間格式:

String specifyDate ="20151011";DateTimeFormatter formatter = DateTimeFormatter.BASIC_ISO_DATE;LocalDate formatted = LocalDate.parse(specifyDate,formatter); System.out.println(formatted);//輸出2015-10-11

當(dāng)然,很多時(shí)間標(biāo)準(zhǔn)的時(shí)間格式可能也不滿足我們的要求逊拍,我們需要轉(zhuǎn)為自定義的時(shí)間格式

DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("YYYY MM dd");System.out.println(formatter2.format(LocalDate.now()));//結(jié)果20151011

9上鞠、java8 時(shí)間類與Date類的相互轉(zhuǎn)化

在轉(zhuǎn)換中,我們需要注意芯丧,因?yàn)閖ava8之前Date是包含日期和時(shí)間的芍阎,而LocalDate只包含日期,LocalTime只包含時(shí)間注整,所以與Date在互轉(zhuǎn)中能曾,勢(shì)必會(huì)丟失日期或者時(shí)間,或者會(huì)使用起始時(shí)間肿轨。如果轉(zhuǎn)LocalDateTime寿冕,那么就不存在信息誤差。

//Date與Instant的相互轉(zhuǎn)化Instant instant? = Instant.now();Date date = Date.from(instant);Instant instant2 = date.toInstant();//Date轉(zhuǎn)為LocalDateTimeDate date2 =newDate();LocalDateTime localDateTime2 = LocalDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault());//LocalDateTime轉(zhuǎn)DateLocalDateTime localDateTime3 = LocalDateTime.now();Instant instant3 = localDateTime3.atZone(ZoneId.systemDefault()).toInstant();Date date3 = Date.from(instant);//LocalDate轉(zhuǎn)Date//因?yàn)長ocalDate不包含時(shí)間椒袍,所以轉(zhuǎn)Date時(shí)驼唱,會(huì)默認(rèn)轉(zhuǎn)為當(dāng)天的起始時(shí)間,00:00:00LocalDate localDate4 = LocalDate.now();Instant instant4 = localDate4.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();Date date4 = Date.from(instant);

總結(jié)驹暑,其實(shí)想說的這玫恳,這篇文章是一篇難產(chǎn)很久的文章,自從十一假期后优俘,一直找不到寫代碼的感覺京办,所以這篇文章拖了1個(gè)月。

?聲明:除非注明帆焕,本站所有文章皆為原創(chuàng)惭婿,轉(zhuǎn)載請(qǐng)以鏈接形式標(biāo)明本文地址。

?轉(zhuǎn)載請(qǐng)注明來源:https://www.rjkf.cn/java8-date-localdate/

作者:陶清清

鏈接:http://www.reibang.com/p/2949db9c3df5

來源:簡(jiǎn)書

簡(jiǎn)書著作權(quán)歸作者所有叶雹,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處财饥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市折晦,隨后出現(xiàn)的幾起案子钥星,更是在濱河造成了極大的恐慌,老刑警劉巖满着,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谦炒,死亡現(xiàn)場(chǎng)離奇詭異贯莺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)编饺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門乖篷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人透且,你說我怎么就攤上這事撕蔼。” “怎么了秽誊?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵鲸沮,是天一觀的道長。 經(jīng)常有香客問我锅论,道長讼溺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任最易,我火速辦了婚禮怒坯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藻懒。我一直安慰自己剔猿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布嬉荆。 她就那樣靜靜地躺著归敬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鄙早。 梳的紋絲不亂的頭發(fā)上汪茧,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音限番,去河邊找鬼舱污。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弥虐,可吹牛的內(nèi)容都是我干的慌闭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼躯舔,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了省古?” 一聲冷哼從身側(cè)響起粥庄,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎豺妓,沒想到半個(gè)月后惜互,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體布讹,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年训堆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了描验。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坑鱼,死狀恐怖膘流,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲁沥,我是刑警寧澤呼股,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站画恰,受9級(jí)特大地震影響彭谁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜允扇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一缠局、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧考润,春花似錦狭园、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俊戳,卻和暖如春揖赴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抑胎。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工燥滑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阿逃。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓铭拧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恃锉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子搀菩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359