java8新特性教程之time包使用總結(jié)
前言
Java8新特性java.time.*包學(xué)習(xí)。 自從java發(fā)布模式變更就發(fā)現(xiàn)自己有些跟不上他們的速度,java8還有不少?zèng)]有用透而9、10、11相繼出來(lái),長(zhǎng)江后浪推前浪一浪勝過(guò)一浪。之前date的使用還不敢自信說(shuō)多透徹,后續(xù)都是淚...(歡迎醬油...)
以jdk1.8.0_111為例
新的設(shè)計(jì)思路
- 引入final定義支持時(shí)間點(diǎn)不可變和線程安全,長(zhǎng)久來(lái)的Date的設(shè)計(jì)一直遭人詬病著;
- 設(shè)計(jì)LocalDate、LocalDateTime、LocalTime、instant、Clock、Duration等類,format\zoo\temporal等包規(guī)范時(shí)間的定義劃分;
- 時(shí)間統(tǒng)一使用 ISO-8601 日歷系統(tǒng),也就是yyyy-MM-dd'T'HH🇲🇲ss:SSSZZ格式,輸出2012-04-13T10:53:43:119+08:00樣子,要是用過(guò)jota-time包估計(jì)你什么都懂了;
- 規(guī)范并提供更加好用的時(shí)間操作方法,plus\minus\with\to\get\of\now等方法命名規(guī)則;
jdk1.8包目錄簡(jiǎn)介:
- time:父級(jí)基礎(chǔ)包,常用的時(shí)間相關(guān)類都在這里,如LocalDate\LocalDateTime\Instant等
- chrono:日歷系統(tǒng)包,日歷相關(guān)的接口(類似Calendar)也包括提供對(duì)其他日歷系統(tǒng)的API
- format:格式化和解析包,主要類是DateTimeFormatter
- temporal:擴(kuò)展功能包,提供細(xì)粒度的時(shí)間控制field、unit,如weeks、months、month-of-year等
- zone:時(shí)區(qū)包,時(shí)區(qū)規(guī)則、本地時(shí)區(qū)等
圍繞常用點(diǎn)和大多數(shù)人經(jīng)常用到做些用例
計(jì)算、格式化、字符串轉(zhuǎn)換這三快可以說(shuō)是很基礎(chǔ)的功能,大多數(shù)人主要圍繞這幾塊進(jìn)行開(kāi)發(fā)和封裝,基礎(chǔ)掌握后面的高級(jí)用法慢慢就可以積累。一般使用都是圍繞time基礎(chǔ)包中LocalDate\LocalDateTime\LocalTime類展開(kāi),先介紹一下這幾個(gè)類及相關(guān)的類。
LocalDate: 一個(gè)ISO-8601日歷系統(tǒng)下的data對(duì)象,如2007-12-03 LocalDateTime: 一個(gè)ISO-8601日歷系統(tǒng)下的data-time對(duì)象,如2007-12-03T10:15:30 LocalTime: 一個(gè)ISO-8601日歷系統(tǒng)下的time對(duì)象,如10:15:30 Instant: 一個(gè)瞬時(shí)的時(shí)間點(diǎn)值對(duì)象,從1970-01-01T00:00:00Z點(diǎn)毫秒計(jì)算的 Clock: 基于instant生成的時(shí)鐘對(duì)象,遵守UTC時(shí)區(qū)規(guī)則可以去生成date和time Duration: 一個(gè)time范圍值對(duì)象,單位也可以是分鐘或小時(shí) Period: 一個(gè)date范圍值對(duì)象,單位可以是年、月、日,和duration正好是兩個(gè)粒度對(duì)象 OffsetDateTime: 從UTC/Greenwich格式時(shí)間偏移成ISO-8601的date-time對(duì)象,如2007-12-03T10:15:30+01:00 OffSetTime: 和OffsetDateTime類似,粒度是到time的UTC時(shí)間格式對(duì)象,如10:15:30+01:00 ZonedDateTime: 帶時(shí)區(qū)的ISO-8601日歷系統(tǒng)的date-time對(duì)象,如2007-12-03T10:15:30+01:00 Europe/Paris ZonedOffset: 一個(gè)帶時(shí)區(qū)的從Greenwich/UTC的偏移量范圍中對(duì)象,如+02:00
網(wǎng)上找的新舊類的比較圖挺好的,貼在這里:
時(shí)間加減計(jì)算
LocalDateTime dateTime = LocalDateTime.now(Clock.system(ZoneId.systemDefault())); LocalDateTime datetime2 =dateTime.minusDays(2); printTest(dateTime); printTest(datetime2); printTest(datetime2.plusHours(3)); printTest(datetime2.minusWeeks(1)); printTest(datetime2.plus(1,ChronoUnit.MONTHS)); printTest(datetime2.compareTo(dateTime)); printTest(datetime2.withYear(2)); printTest(datetime2.isBefore(dateTime)); Duration duration = Duration.ofDays(5); printTest(duration); printTest(duration.plusHours(2).toMinutes());
結(jié)果:
1 : 2019-01-29 11:01:49
2 : 2019-01-27 11:01:49
3 : 2019-01-27 14:01:49
4 : 2019-01-20 11:01:49
5 : 2019-02-27 11:01:49
6 : -2
7 : 0002-01-27 11:01:49
8 : true
9 : PT120H
10 : 7320
時(shí)間輸出格式化
LocalDateTime dateTime = LocalDateTime.now(Clock.systemDefaultZone()); printTest(dateTime); printTest(dateTime.format(DateTimeFormatter.BASIC_ISO_DATE)); printTest(dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); printTest(dateTime.format(DateTimeFormatter.ISO_WEEK_DATE)); printTest(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH🇲🇲ss.SSS"))); DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); builder.appendPattern("yyyy-MM-dd"); builder.parseStrict().toFormatter(); printTest(dateTime.format(builder.parseStrict().toFormatter()));
結(jié)果:
1 : 2019-01-29 11:14:07
2 : 20190129
3 : 2019-01-29T11:14:07.232
4 : 2019-W05-2
5 : 2019-01-29 11:14:07.232
6 : 2019-01-29
時(shí)間對(duì)象和string相互轉(zhuǎn)換
LocalDateTime dateTime = LocalDateTime.now(Clock.system(ZoneId.systemDefault())); printTest(dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE)); printTest(dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); printTest(dateTime.format(DateTimeFormatter.ISO_LOCAL_TIME)); printTest(dateTime.format(DateTimeFormatter.BASIC_ISO_DATE)); printTest(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH🇲🇲ss"))); printTest(dateTime.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT))); printTest(dateTime.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM))); printTest(dateTime.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.valueOf("MEDIUM")))); printTest(LocalDateTime.parse("2019-12-03T10:15:30").toString()); printTest(LocalDate.parse("2019-12-03",DateTimeFormatter.ISO_LOCAL_DATE)); printTest(LocalTime.parse("10:15:30",DateTimeFormatter.ISO_LOCAL_TIME));
結(jié)果:
1 : 2019-01-29
2 : 2019-01-29T10:35:38.508
3 : 10:35:38.508
4 : 20190129
5 : 2019-01-29 10:35:38
6 : 19-1-29 上午10:35
7 : 2019-1-29 10:35:38
8 : 2019-1-29 10:35:38
9 : 2019-12-03T10:15:30
10 : 2019-12-03
11 : 10:15:30
新API和就Date轉(zhuǎn)換策略
LocalDateTime localDateTime = LocalDateTime.now(); localDateTime.minusHours(2); printTest(localDateTime); Date localDateTime2 = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); printTest(localDateTime2.toString()); LocalDate localDate = LocalDate.now(); printTest(localDate); Date localDate2 = Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); printTest(localDate2); Date date = new Date(); printTest(date); LocalDateTime date2 = LocalDateTime.ofInstant(date.toInstant(),ZoneId.systemDefault()); printTest(date2); LocalTime localTime = LocalDateTime.ofInstant(new Date().toInstant(),ZoneId.systemDefault()).toLocalTime(); printTest(localTime);
結(jié)果:
1 : 2019-01-29 13:06:58
2 : Tue Jan 29 13:06:58 CST 2019
3 : 2019-01-29
4 : Tue Jan 29 00:00:00 CST 2019
5 : Tue Jan 29 13:06:58 CST 2019
6 : 2019-01-29 13:06:58
7 : 13:06:58.343
想學(xué)好一件東西,強(qiáng)烈建議你買本書(shū)看看
不要聽(tīng)信那些“網(wǎng)上找找文檔看看就能掌握”的鬼話,過(guò)來(lái)人都明白知識(shí)體系的分量有多重要。自己找的資料是非常零碎的,同時(shí)需要你很強(qiáng)大的知識(shí)構(gòu)建能力去把這些都串起來(lái)。很不幸,這樣的能力絕大多數(shù)人都不具備。
每一本技術(shù)書(shū)的完成都不是一朝一夕隨隨便便就寫(xiě)出來(lái)的,作者用心良苦的在思考如何幫助你去理解。寫(xiě)書(shū)和技術(shù)能力有時(shí)不一定成正比,但邏輯思維能力應(yīng)該不弱。反正寫(xiě)技術(shù)書(shū)的人在我心里都是神一般的存在,雖然垃圾書(shū)比較多但不影響我對(duì)他們的仰慕。
推薦
常用java處理時(shí)間包:joda-time
java8-api文檔:jdk8-doc
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
springboot整合企微webhook機(jī)器人發(fā)送消息提醒
這篇文章主要為大家介紹了springboot整合企微webhook機(jī)器人發(fā)送消息提醒,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12java內(nèi)存模型jvm虛擬機(jī)簡(jiǎn)要分析
Java 內(nèi)存模型的主要目的是定義程序中各種變量的訪問(wèn)規(guī)則, 關(guān)注在虛擬機(jī)中把變量值存儲(chǔ)到內(nèi)存和從內(nèi)存中取出變量值這樣的底層細(xì)節(jié)2021-09-09IntelliJ IDEA中程序包org.slf4j找不到的解決
這篇文章主要介紹了IntelliJ IDEA中程序包org.slf4j找不到的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的鏈表的概念與實(shí)現(xiàn)
鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針連接次序?qū)崿F(xiàn)的,每一個(gè)鏈表都包含多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)又包含兩個(gè)部分,一個(gè)是數(shù)據(jù)域,一個(gè)是引用域2022-03-03springboot+redis實(shí)現(xiàn)簡(jiǎn)單的熱搜功能
這篇文章主要介紹了springboot+redis實(shí)現(xiàn)一個(gè)簡(jiǎn)單的熱搜功能,通過(guò)代碼介紹了過(guò)濾不雅文字的過(guò)濾器,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05java程序員必須知道的4個(gè)書(shū)寫(xiě)代碼技巧
本篇文章主要給大家講述了作為JAVA程序員如何能寫(xiě)出高效的代碼以及運(yùn)行效率更高的代碼,一起學(xué)習(xí)分享下吧。2017-12-12java實(shí)現(xiàn)簡(jiǎn)單的學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02