來自:Java譯站html
連接:http://it.deepinmind.com/java/2015/03/17/20-examples-of-date-and-time-api-from-Java8.htmljava
英文:http://javarevisited.blogspot.sg/2015/03/20-examples-of-date-and-time-api-from-Java8.htmlapi
本文根據上述資料進行整理修改說明安全
java8引入了一套全新的時間日期API,本篇隨筆將說明學習java8的這套API。學習
java。time包中的是類是不可變且線程安全的。新的時間及日期API位於java.time中,下面是一些關鍵類線程
●Instant——它表明的是時間戳3d
●LocalDate——不包含具體時間的日期,好比2014-01-14。它能夠用來存儲生日,週年記念日,入職日期等。orm
●LocalTime——它表明的是不含日期的時間htm
●LocalDateTime——它包含了日期及時間,不過仍是沒有偏移信息或者說時區。blog
●ZonedDateTime——這是一個包含時區的完整的日期時間,偏移量是以UTC/格林威治時間爲基準的。
一、如何在java8中獲取當天的日期
java8中有個叫LocalDate的類,能用來表示今天的日期。這個類與java.util.Date略有不一樣,由於它只包含日期,沒有時間。
能夠看到,他建立了今天的日期卻不包含時間信息,而且格式化了日期。
二、如何在java8中獲取當前的年月日
LocalDate類中提供了一些很方便的方法能夠用來提取年月日以及其餘的日期屬性,特別方便,只須要使用對應的getter方法就能夠了,很是直觀
三、在java8中如何獲取某個特定的日期
經過另外一個方法,能夠建立出任意一個日期,它接受年月日的參數,而後返回一個等價的LocalDate實例。在這個方法裏,須要的日期你填寫什麼就是什麼,不想以前的API中月份必須從0開始
四、在java8中檢查兩個日期是否相等
LocalDate重寫了equals方法來進行日期的比較,以下所示:
五、在java8中如何檢查重複事件,好比生日
在java中還有一個與時間日期相關的任務就是檢查重複事件,好比每個月的帳單日
如何在java中判斷是不是某個節日或者重複事件,使用MonthDay類。這個類由月日組合,不包含年信息,能夠用來表明每一年重複出現的一些日期或其餘組合。他和新的日期庫中的其餘類同樣也都是不可變且線程安全的,而且它仍是一個值類(value class)。
經過列子能夠看到MonthDay只存儲了月日,對比兩個日期的月日便可知道是否重複
六、如何在java8中獲取當前時間
這個與第一個例子獲取當前日期很是類似,這裏用的是LocalTime類,默認的格式是hh:mm:ss:nnn
能夠看到,這個時間是不包含日期的
七、如何增長時間裏面的小時數
不少時候須要對時間進行操做,好比加一個小時來計算以後的時間,java8提供了更方便的方法 如plusHours,這些方法返回的是一個新的LocalTime實例的引用,由於LocalTime是不可變的
八、如何獲取1周後的日期
這個與前一個獲取2小時後的時間的例子很類似,這裏咱們獲取的是1周後的日期。LocalDate是用來表示無時間的日期,他又一個plus()方法能夠用來增長日,星期,月,ChronoUnit則用來表示時間單位,LocalDate也是不可變的,所以任何修改操做都會返回一個新的實例
能夠看到一週後的日期是什麼,也能夠用這個方法來增長一個月,一年,一小時,一分等等
九、一年先後的日期
在上個例子中咱們使用了LocalDate的plus()方法來給日期增長日周月,如今咱們用minus()方法來找出一年前的那天
十、在java8中使用時鐘
java8自帶了Clock類,能夠用來獲取某個時區下(因此對時區是敏感的)當前的瞬時時間、日期。用來代替System.currentTimelnMillis()與TimeZone.getDefault()方法
十一、在java中如何判斷某個日期在另外一個日期的前面仍是後面
如何判斷某個日期在另外一個日期的前面仍是後面或者相等,在java8中,LocalDate類中使用isBefore()、isAfter()、equals()方法來比較兩個日期。若是調用方法的那個日期比給定的日期要早的話,isBefore()方法會返回true。equals()方法在前面的例子中已經說明了,這裏就不舉例了
能夠看到java8中比較日期很是簡單,再也不須要使用Calendar這樣另外的類來完成相似的任務了
十二、在java8中處理不一樣的時區
java8中不只將日期和時間進行了分離,同時還有時區。好比ZonId表明的是某個特定時區,ZonedDateTime表明帶時區的時間,等同於之前的GregorianCalendar類。使用該類,能夠將本地時間轉換成另外一個時區中的對應時間。
注意:對應時區的文本能夠直接手動填寫,也能夠調用定義好了的,手動填寫的時候注意不可填錯了,不然你會遇到下面的異常
1三、如何表示固定的日期,好比信用卡過時時間
正如MonthDay表示的是某個重複出現的日子,YearMonth是另一個組合,表明的是像信用卡還款日,按期存款到期日,options到期日這類的日期。你能夠用這個類找出這個月有多少天,LengthOfMonth()這個方法返回的是這個YearMonth實例有多少天,這對於檢查2月是否潤2月頗有用
1四、如何在java8中檢查閏年
LocalDate類由一個isLeapYear()方法來返回當前LocalDate對應的那年是不是閏年
1五、兩個日期之間包含多少天,多少月
計算兩個日期之間包含多少天、周、月、年。能夠用java.time.Period類完成該功能。下面例子中將計算日期與未來的日期之間一共有幾個月
1六、帶時區的日期與時間
在java8中,可使用ZoneOffset來表明某個時區,可使用它的靜態方法ZoneOffset.of()方法來獲取對應的時區,只要得到了這個偏移量,就能夠用這個偏移量和LocalDateTime建立一個新的OffsetDateTime
能夠看到如今時間日期和時區關聯上了,注意OffsetDateTime主要是用來給機器理解的,平時使用就用前面結束的ZoneDateTime類就能夠了
1七、在java8中獲取當前時間戳
java8獲取時間戳特別簡單。Instant類由一個靜態的工廠方法now()能夠返回當前時間戳
能夠看到,當前時間戳是包含日期和時間的,與java.util.Date很相似,事實上Instant就是java8之前的Date,可使用這個兩個類中的方法在這兩個類型之間進行轉換,好比Date.from(Instant)就是用來把Instant轉換成java.util.date的,而Date。toInstant()就是將Date轉換成Instant的
18,如何在java8中使用預約義的格式器來對日期進行解析/格式化
在java8以前,時間日期的格式化很是麻煩,常用SimpleDateFormat來進行格式化,可是SimpleDateFormat並非線程安全的。在java8中,引入了一個全新的線程安全的日期與時間格式器。而且預約義好了格式。好比,本例中使用的BASICISODATE格式會將20160414格式化成2016-04-14
在DateTimeFormatter中還有不少定義好的格式,有興趣的能夠本身去看一下
1九、如何在java中使用自定義的格式器來解析日期
在上例中,咱們使用了預置的時間日期格式器來解析日期字符串了,可是有時預置的不能知足的時候就須要咱們自定義日期格式器了,下面的例子中的日期格式是"MM dd yyyy".你能夠給DateTimeFormatter的ofPattern靜態方法()傳入任何的模式,它會返回一個實例,這個模式的字面量與前例中是相同的。好比M表明月,m仍表明分,無效的模式會拋異常DateTimeParseException。
20、如何在java8中對日期進行格式化,轉換成字符串
前面的兩個例子中,咱們主要是對日期字符串來進行解析轉換成日期,在這個例子咱們相反,是把日期轉換成字符。這裏咱們有個LocalDateTime類的實例,咱們要把他轉換成一個格式化好的日期串,與前例相同的是,咱們仍須要制定模式串去建立一個DateTimeFormatter類的實例,但調用的是LocalDate.format()。這個方法會返回一個表明當前日期的字符串,對應的模式就是傳入的DateTimeFormatter實例中定義好的。
通過上面的例子,咱們已經對java8的時間日期有了必定的瞭解,如今回顧一下
●它提供了javax.time.ZoneId用來處理時區。
●它提供了LocalDate與LocalTime類
●Java 8中新的時間與日期API中的全部類都是不可變且線程安全的,這與以前的Date與Calendar API中的剛好相反,那裏面像java.util.Date以及SimpleDateFormat這些關鍵的類都不是線程安全的。
●新的時間與日期API中很重要的一點是它定義清楚了基本的時間與日期的概念,比方說,瞬時時間,持續時間,日期,時間,時區以及時間段。它們都是基於ISO日曆體系的。
每一個Java開發人員都應該至少了解這套新的API中的這五個類:
●Instant 它表明的是時間戳,好比2016-04-14T14:20:13.592Z,這能夠從java.time.Clock類中獲取,像這樣: Instant current = Clock.system(ZoneId.of("Asia/Tokyo")).instant();
●LocalDate 它表示的是不帶時間的日期,好比2016-04-14。它能夠用來存儲生日,週年記念日,入職日期等。
●LocalTime - 它表示的是不帶日期的時間
●LocalDateTime - 它包含了時間與日期,不過沒有帶時區的偏移量
●ZonedDateTime - 這是一個帶時區的完整時間,它根據UTC/格林威治時間來進行時區調整
●這個庫的主包是java.time,裏面包含了表明日期,時間,瞬時以及持續時間的類。它有兩個子package,一個是java.time.foramt,這個是什麼用途就很明顯了,還有一個是java.time.temporal,它能從更低層面對各個字段進行訪問。
●時區指的是地球上共享同一標準時間的地區。每一個時區都有一個惟一標識符,同時還有一個地區/城市(Asia/Tokyo)的格式以及從格林威治時間開始的一個偏移時間。好比說,東京的偏移時間就是+09:00。
●OffsetDateTime類實際上包含了LocalDateTime與ZoneOffset。它用來表示一個包含格林威治時間偏移量(+/-小時:分,好比+06:00或者 -08:00)的完整的日期(年月日)及時間(時分秒,納秒)。
●DateTimeFormatter類用於在Java中進行日期的格式化與解析。與SimpleDateFormat不一樣,它是不可變且線程安全的,若是須要的話,能夠賦值給一個靜態變量。DateTimeFormatter類提供了許多預約義的格式器,你也能夠自定義本身想要的格式。固然了,根據約定,它還有一個parse()方法是用於將字符串轉換成日期的,若是轉換期間出現任何錯誤,它會拋出DateTimeParseException異常。相似的,DateFormatter類也有一個用於格式化日期的format()方法,它出錯的話則會拋出DateTimeException異常。
●再說一句,「MMM d yyyy」與「MMm dd yyyy」這兩個日期格式也略有不一樣,前者能識別出"Jan 2 2014"與"Jan 14 2014"這兩個串,然後者若是傳進來的是"Jan 2 2014"則會報錯,由於它指望月份處傳進來的是兩個字符。爲了解決這個問題,在天爲個位數的狀況下,你得在前面補0,好比"Jan 2 2014"應該改成"Jan 02 2014"。
關於Java 8這個新的時間日期API就講到這了。這幾個簡短的示例 對於理解這套新的API中的一些新增類已經足夠了。咱們學習瞭如何建立與修改日期實例。咱們還了解了純日期,日期加時間,日期加時區的區別,知道如何比較兩個日期,如何找到某天到指定日期好比說下一個生日,週年記念日或者保險日還有多少天。咱們還學習瞭如何在Java 8中用線程安全的方式對日期進行解析及格式化,而無需再使用線程本地變量或者第三方庫這種取巧的方式。新的API能勝任任何與時間日期相關的任務。