java8——新的日期API

緒論

我們相信大多數(shù)有經(jīng)驗(yàn)的程序員都會贊同java8之前的庫對日期和時間的支持非常的不理想闷盔。然而,java8引入了全新的日期和時間API就是要解決這個問題。

LocalDate,LocalTime,Instant,Duration以及Period

使用LocalDate和LocalTime

LocalDate

LocalDate的實(shí)例是一個不可變的對象,它只提供了簡單的日期,并不含當(dāng)天的時間信息科贬。另外,它也不附帶任何與市區(qū)相關(guān)的信息鳖悠。
你可以通過靜態(tài)工廠方法of創(chuàng)建一個LocalDate實(shí)例榜掌。LocalDate實(shí)例提供了多種方法來讀取常用的值,比如年份乘综,月份憎账,星期幾。

LocalDate date = LocalDate.of(2017,6,23);
int year = date.getYear();//2017
Month month = date.getMonth();//6
int day = date.getDayOfMonth; //23
DayOfWeek dow = date.getDayOfWeek();//Fridiay
int len = date.lenghtofMonth();//30
boolean leap = date.isLwapYear();//false

你還可以使用工廠方法從系統(tǒng)時鐘中獲取當(dāng)前的日期

LocalDate today = LocalDate.now();

LocalTime

LocalTime time = LocalTime.of(13,45,20);
int hour = time.getHour(); //13
int minute = time.getHour(); // 45 
int second = time.getMinute();// 20

LocalDate和LocalTime都可以通過解析代表他們的字符串創(chuàng)建卡辰。使用靜態(tài)方法parse胞皱,可以實(shí)現(xiàn)這一目的:

LocalDate date = LocalDate.parse("2017-03-18");
LocalTime time = LocalTime.parse("13:45:20");

你可以向parse方法傳遞一個DateTimeFormatter.該類的實(shí)例定義了如何格式化一個日期或者時間對象。正如我們之前所介紹的九妈,他是替換老版java.util.DateFormat的推薦替代品反砌。同時,也請注意萌朱,一旦傳遞的字符串參數(shù)無法被解析為合法的LocalDate和LocalTime對象宴树,這兩個parse方法都會跑出一個繼承自RuntimeException的DateTimeParseException異常。

合并日期和時間

這個復(fù)合類叫做LocalDateTime,是LocalDate和LocalTime的合體晶疼。它同時表示了日期和時間酒贬,但不帶有時區(qū)信息又憨,你可以直接創(chuàng)建,也可以通過合并日期和時間對象構(gòu)造锭吨。

LocalDateTime dt1 = LcoalDateTime.of(2017,3,18,13,45,20);
LocalDateTime dt2 = LocalDateTime.of(date,time);
LocalDateTime dt3 = date.atTime(13,45,20);
LocalDateTime dt4 = date.atTime(time);
LocalDateTime dt5 = time.atDate(date);

注意竟块,通過他們各自的atTime或者atDate方法,向LocalDate傳遞了一個時間對象耐齐,或者向LoaclTime傳遞一個日期對象的方式,你可以創(chuàng)建一個LocalDateTime對象蒋情。你也可以使用toLocalDate或者toLocalTime方法埠况,從LocalDateTime中提起LocalDate或者LocalTime組件:

LocalDate date1 = dt1.toLocalDate();
LocalDate time1 = dt1.toLocalTime();

定義Duration或者Period

我們已經(jīng)了解了創(chuàng)建Temporal實(shí)例的幾種方法。很自然地你會想到棵癣,我們需要創(chuàng)建兩個Temporal對象之間的duration辕翰。Duration類的靜態(tài)工廠方法between就是為這個目的而設(shè)計的。你可以創(chuàng)建兩個LocalTime對象狈谊,兩個LocalDateTimes對象喜命。或者兩個Instant對象之間的duration河劝。

Duration d1 = Duration.between(time1,time2);
Duration d1 = Duration.between(dateTime1,dateTime2);
Duration d2 = Duration.between(instant1,instant2);

由于LocalDateTime和Instant是為了不同的目的而設(shè)計的壁榕,一個是為了便于人閱讀使用,另一個是為了便于機(jī)器處理赎瞎,所以你不能將二者混用牌里。此外,由于Duration主要用于以秒和納秒衡量時間的長短务甥,你不能僅僅向between方法傳遞一個LcoalDate對象做參數(shù)牡辽。

如果你需要以年,月敞临,或者日的方式對多個時間單位建模态辛,可以使用Period類。使用該類的工廠方法between,你可以使用得到兩個LocalDate之間的時長挺尿。

Period tenDays = Period.between((LocalDate.of(2017,3,8),LocalDate.of(2017.3.18));

操縱奏黑,解析和格式化日期

如果你已經(jīng)有一個LocalDate對象,想要創(chuàng)建它的一個修改版票髓,最直接也是最簡單的方法是使用withAttribute方法攀涵。

LocalDate date1 = LcoalDate.of(2014.3.18);//2014-03-18
LocalDate date2 = date1.withYear(2011);//2011-03-18
LocalDate date3 = date2.withDayOfMonth(25);//2011-03-25
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR,9);//2011-09-25

以相對方式修改LocalDate對象的屬性

LocalDate date1 = LocalDate.of(2014,3,18);
LocalDate date2 = date1.plusWeeks(1);//2014-03-25
LocalDate date3 = date2.minusYears(3);//2011-03-25

使用TemporalAdjuster

截止目前,你所看到的所有日期操作都是相對比較直接的洽沟。有的時候以故,你需要進(jìn)行更加復(fù)雜的操作,比如裆操,將日期調(diào)整到下個周日怒详,下個工作日炉媒,或者是本月的最后一天。這時昆烁,你可以使用重載版本的with方法吊骤,向其傳遞一個提供了更多定制化選擇的TemporalAdjuster對象,更加靈活地處理日期静尼。

LocalDate date1 = LocalDate.of(2014,3,18);//2014-03-18
LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY));//2014-03-23
LocalDate date3 = date2.with(lastDayOfMonth());//2014-03-31

TemporalAdjuster中包含的工廠方法列表


image

打印輸出及解析日期-時間對象

LocalDate date = LocalDate.of(2014,3,18);
String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);//20140318
String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);//2014-03-18

你也可以通過解析代表日期或時間的字符串重新創(chuàng)建該日期對象白粉。所有的日期和時間API都提供了表示時間點(diǎn)或者時間段的工廠方法,你可以使用工廠方法parse達(dá)到重新創(chuàng)建該日期對象的目的:

LocalDate date1 = LocalDate.parse("20140318",DateTimeFormatter.BASIC_ISO_DATE);
lcoalDate date2 = LocalDate.parse("2014-03-18",DateTimeFormatter.ISO_LOCAL_DATE);

和老的java.util.DateFormat相比較鼠渺,所有的DateTimeFormatter實(shí)例都是線程安全的鸭巴。所以,你能夠以單例模式創(chuàng)建格式器實(shí)例拦盹,就像DateTimeFomatter所定義的那些常量鹃祖,并能在多個線程間共享這些實(shí)例。DateTimeFormatter類還支持一個靜態(tài)工廠方法普舆,它可以按照某個特定的模式創(chuàng)建格式器恬口。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date1 = LocalDate.of(2014,3,18);
String fomattedDate = date1.format(formatter);
LocalDate date 2 = LocalDate.parse(formattedDate,formatter);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沼侣,隨后出現(xiàn)的幾起案子祖能,更是在濱河造成了極大的恐慌,老刑警劉巖华临,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芯杀,死亡現(xiàn)場離奇詭異,居然都是意外死亡雅潭,警方通過查閱死者的電腦和手機(jī)揭厚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扶供,“玉大人筛圆,你說我怎么就攤上這事〈慌ǎ” “怎么了太援?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扳碍。 經(jīng)常有香客問我提岔,道長,這世上最難降的妖魔是什么笋敞? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任碱蒙,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赛惩。我一直安慰自己哀墓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布喷兼。 她就那樣靜靜地躺著篮绰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪季惯。 梳的紋絲不亂的頭發(fā)上吠各,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機(jī)與錄音勉抓,去河邊找鬼走孽。 笑死,一個胖子當(dāng)著我的面吹牛琳状,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盒齿,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼念逞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了边翁?” 一聲冷哼從身側(cè)響起翎承,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎符匾,沒想到半個月后叨咖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啊胶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年甸各,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焰坪。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡趣倾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出某饰,到底是詐尸還是另有隱情儒恋,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布黔漂,位于F島的核電站诫尽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炬守。R本人自食惡果不足惜牧嫉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劳较。 院中可真熱鬧驹止,春花似錦浩聋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抖仅,卻和暖如春坊夫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撤卢。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工环凿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人放吩。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓智听,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渡紫。 傳聞我的和親對象是個殘疾皇子到推,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 當(dāng)你開始使用Java操作日期和時間的時候,會有一些棘手惕澎。你也許會通過System.currentTimeMilli...
    程序猿的那些事閱讀 2,272評論 0 1
  • Java 8日期/時間( Date/Time)API是開發(fā)人員最受追捧的變化之一莉测,Java從一開始就沒有對日期時間...
    xiaogmail閱讀 1,092評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)唧喉,斷路器捣卤,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 不做軟件項(xiàng)目可能永遠(yuǎn)也不會考慮日期和時間的使用問題。上學(xué)時做的最多的是數(shù)學(xué)模型和算法的仿真驗(yàn)證八孝,根本不用操心軟件里...
    CoderShangfeng閱讀 1,368評論 0 1
  • 一生一會 文/林清玄 我喜歡茶道里關(guān)于“一生一會”的說法董朝。 意思是說,我們每次與朋友對坐喝茶干跛,都應(yīng)...
    遇見悅渡閱讀 476評論 0 0