轉載地址:http://www.cnblogs.com/comeboo/p/5378922.html
轉載地址:http://blog.csdn.net/hspingcc/article/details/73332526
java8引入了一套全新的時間日期API,本篇隨筆將說明學習java8的這套API。
java。time包中的是類是不可變且線程安全的。新的時間及日期API位於java.time中,下面是一些關鍵類
●Instant——它代表的是時間戳
●LocalDate——不包含具體時間的日期,比如2014-01-14。它可以用來存儲生日,周年紀念日,入職日期等。
●LocalTime——它代表的是不含日期的時間
●LocalDateTime——它包含了日期及時間,不過還是沒有偏移信息或者說時區。
●ZonedDateTime——這是一個包含時區的完整的日期時間,偏移量是以UTC/格林威治時間為基准的。
java8是如何處理時間及日期的
1、如何在java8中獲取當天的日期
java8中有個叫LocalDate的類,能用來表示今天的日期。這個類與java.util.Date略有不同,因為它只包含日期,沒有時間。
可以看到,他創建了今天的日期卻不包含時間信息,並且格式化了日期。
2、如何在java8中獲取當前的年月日
LocalDate類中提供了一些很方便的方法可以用來提取年月日以及其他的日期屬性,特別方便,只需要使用對應的getter方法就可以了,非常直觀
3、在java8中如何獲取某個特定的日期
通過另一個方法,可以創建出任意一個日期,它接受年月日的參數,然后返回一個等價的LocalDate實例。在這個方法里,需要的日期你填寫什么就是什么,不想之前的API中月份必須從0開始
4、在java8中檢查兩個日期是否相等
LocalDate重寫了equals方法來進行日期的比較,如下所示:
5、在java8中如何檢查重復事件,比如生日
在java中還有一個與時間日期相關的任務就是檢查重復事件,比如每月的賬單日
如何在java中判斷是否是某個節日或者重復事件,使用MonthDay類。這個類由月日組合,不包含年信息,可以用來代表每年重復出現的一些日期或其他組合。他和新的日期庫中的其他類一樣也都是不可變且線程安全的,並且它還是一個值類(value class)。
通過列子可以看到MonthDay只存儲了月日,對比兩個日期的月日即可知道是否重復
6、如何在java8中獲取當前時間
這個與第一個例子獲取當前日期非常相似,這里用的是LocalTime類,默認的格式是hh:mm:ss:nnn
可以看到,這個時間是不包含日期的
7、如何增加時間里面的小時數
很多時候需要對時間進行操作,比如加一個小時來計算之后的時間,java8提供了更方便的方法 如plusHours,這些方法返回的是一個新的LocalTime實例的引用,因為LocalTime是不可變的
8、如何獲取1周后的日期
這個與前一個獲取2小時后的時間的例子很相似,這里我們獲取的是1周后的日期。LocalDate是用來表示無時間的日期,他又一個plus()方法可以用來增加日,星期,月,ChronoUnit則用來表示時間單位,LocalDate也是不可變的,因此任何修改操作都會返回一個新的實例
可以看到一周后的日期是什么,也可以用這個方法來增加一個月,一年,一小時,一分等等
9、一年前后的日期
在上個例子中我們使用了LocalDate的plus()方法來給日期增加日周月,現在我們用minus()方法來找出一年前的那天
10、在java8中使用時鍾
java8自帶了Clock類,可以用來獲取某個時區下(所以對時區是敏感的)當前的瞬時時間、日期。用來代替System.currentTimelnMillis()與TimeZone.getDefault()方法
11、在java中如何判斷某個日期在另一個日期的前面還是后面
如何判斷某個日期在另一個日期的前面還是后面或者相等,在java8中,LocalDate類中使用isBefore()、isAfter()、equals()方法來比較兩個日期。如果調用方法的那個日期比給定的日期要早的話,isBefore()方法會返回true。equals()方法在前面的例子中已經說明了,這里就不舉例了
可以看到java8中比較日期非常簡單,不再需要使用Calendar這樣另外的類來完成類似的任務了
12、在java8中處理不同的時區
java8中不僅將日期和時間進行了分離,同時還有時區。比如ZonId代表的是某個特定時區,ZonedDateTime代表帶時區的時間,等同於以前的GregorianCalendar類。使用該類,可以將本地時間轉換成另一個時區中的對應時間。
注意:對應時區的文本可以直接手動填寫,也可以調用定義好了的,手動填寫的時候注意不可填錯了,否則你會遇到下面的異常
13、如何表示固定的日期,比如信用卡過期時間
正如MonthDay表示的是某個重復出現的日子,YearMonth是另外一個組合,代表的是像信用卡還款日,定期存款到期日,options到期日這類的日期。你可以用這個類找出這個月有多少天,LengthOfMonth()這個方法返回的是這個YearMonth實例有多少天,這對於檢查2月是否潤2月很有用
14、如何在java8中檢查閏年
LocalDate類由一個isLeapYear()方法來返回當前LocalDate對應的那年是否是閏年
15、兩個日期之間包含多少天,多少月
計算兩個日期之間包含多少天、周、月、年。可以用java.time.Period類完成該功能。下面例子中將計算日期與將來的日期之間一共有幾個月
16、帶時區的日期與時間
在java8中,可以使用ZoneOffset來代表某個時區,可以使用它的靜態方法ZoneOffset.of()方法來獲取對應的時區,只要獲得了這個偏移量,就可以用這個偏移量和LocalDateTime創建一個新的OffsetDateTime
可以看到現在時間日期和時區關聯上了,注意OffsetDateTime主要是用來給機器理解的,平時使用就用前面結束的ZoneDateTime類就可以了
17、在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
19、如何在java中使用自定義的格式器來解析日期
在上例中,我們使用了預置的時間日期格式器來解析日期字符串了,但是有時預置的不能滿足的時候就需要我們自定義日期格式器了,下面的例子中的日期格式是”MM dd yyyy”.你可以給DateTimeFormatter的ofPattern靜態方法()傳入任何的模式,它會返回一個實例,這個模式的字面量與前例中是相同的。比如M代表月,m仍代表分,無效的模式會拋異常DateTimeParseException。
20、如何在java8中對日期進行格式化,轉換成字符串
前面的兩個例子中,我們主要是對日期字符串來進行解析轉換成日期,在這個例子我們相反,是把日期轉換成字符。這里我們有個LocalDateTime類的實例,我們要把他轉換成一個格式化好的日期串,與前例相同的是,我們仍需要制定模式串去創建一個DateTimeFormatter類的實例,但調用的是LocalDate.format()。這個方法會返回一個代表當前日期的字符串,對應的模式就是傳入的DateTimeFormatter實例中定義好的。