本篇文章為大家展示了如何理解Java 8中時間API,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
留意到其中Java 8預覽版中將會出現新的關于日期和時間的API(遵守JSR 310規范)。對這些新的API進行舉例說明。首先先介紹以下幾個:Instant,LocalDate,LocalTime和LocalDateTime。
Instant (java.time.Instant)
可能最容易開始學習java.time包中的內容的就是先來看看Instant這個類。所謂的Instant類代表的是某個時間(有點象java.util.Date),它是精確到納秒的(而不是象舊版本的Date精確到毫秒)。如果使用納秒去表示一個時間則原來的使用一位Long類型是不足夠的,需要占用更多一點的存儲空間,然而實際上其內部是由兩個Long字段組成,***個部分保存的是自標準Java計算時代(就是1970年1月1日開始)到現在的秒數,第二部分保存的是納秒數(永遠不會超過999,999,999)。我們看下一個具體的例子:
//獲得當前時間
//獲得當前時間
Instant instant = Instant.now();
// 以ISO-8601輸出
System.out.println(instant);
在Open JDK 中運行上面的代碼,可以有如下格式的輸出:2013-06-25T16:22:52.966Z,可以看到,輸入了更為精確的日期。下面的例子是更多的關于Instant類的用法,如
//將java.util.Date轉換為Instant Instant instant = Instant.ofEpochMilli(new Date().getTime()); //從字符串類型中創建Instant類型的時間 instant = Instant.parse("1995-10-23T10:12:35Z");
注意,在上面的例子中,有一個字符串中創建Instant類型的時間,但Instant代表的是一個時間,并不包括時區的概念,所以必須傳入的是符合UTC格式的字符串)。Instant API也提供了一些很有用的方法允許使用Instant和其他包中的類進行一些運算,下面是例子:
instant.plus(Duration.ofHours(5).plusMinutes(4));
上面表達的含義為,將現在的時間加上5個小時4分鐘。
那么這個例子中,使用了多少個java.time.Instant實例呢?答案是兩個。Java.time這個包是線程安全的并且和其他大部分類一樣是不可變類。Instant也遵守這個規則,因此plus方法產生一個新的實例,如:
Instant instant1 = instant.plus(Duration.ofHours(5).plusMinutes(4)); System.out.println("Instant is immutable, so instant==instant returns: " + (instant == instant1));
輸出為:
Instant is immutable, so instant==instant returns: false
下面是更多關于計算的例子:
// Substract 5 days of an instant 計算5天前 instant.minus(5, ChronoUnit.DAYS); // Option 1 方法1 instant.minus(Duration.ofDays(5)); // Option 2 方法2 //計算兩個Instant之間的分鐘數 long diffAsMinutes = instant.periodUntil(instant1, ChronoUnit.MINUTES); // 方法1 long diffAsMinutes = ChronoUnit.MINUTES.between(instant, instant1); // 方法2
Instant是可比較的,這意味著可以對兩個Instant進行比較。它提供了isAfter()和isBefore()兩個方法進行比較,如下代碼所示:
//用compareTo方法比較 System.out.format("instant1.compareTo(instant)=%d.%n", instant1.compareTo(instant)); // 使用isAfter()和isBefore() System.out.format("instant1.isAfter(instant)=%b, instant1.isBefore(instant)=%b.%n", instant1.isAfter(instant), instant1.isBefore(instant))
輸出結果:
instant1.compareTo(instant)=1. instant1.isAfter(instant)=true, instant1.isBefore(instant)=false
Localdate和LocalTime
LocalDate表示不帶時區的日期,比如1-1-2000。LocalTime表示不帶時區的時間,比如04:44:50.12,和之前提到的Instant類是從1970年計算偏移量不同,這兩個類的輸出是人們習慣閱讀的日期和時間。有很多種方法去獲得LocalTime和LocalDate的實例,如
LocalDate localDate = LocalDate.now();
localDate = LocalDate.ofYearDay(2005, 86); // 獲得2005年的第86天 (27-Mar-2005)
localDate = LocalDate.of(2013, Month.AUGUST, 10); //2013年8月10日
LocalTime localTime = LocalTime.of(22, 33); //10:33 PM
localTime = LocalTime.now();
localTime = LocalTime.ofSecondOfDay(4503); // 返回一天中的第4503秒 (1:15:30 AM)
LocalDate和LocalTime和Instant一樣遵守同樣的線程規定―― 如它們的實例子都是不可變的。LocalDate和LocalTime和Instant有同樣的計算和比較方法(其中有些方法是在java.time.temporal.Temporal接口中定義的,并且上面這些類都實現了這些方法):
LocalDate localDate1 = localDate.plus(5, ChronoUnit.HOURS); localDate.isBefore(localDate1);
LocalDateTime
***來看下在簡單日期和時間類中最重要的一個:LocalDataTeime。它是LocalDate和LocalTime的組合體,表示的是不帶時區的日期及時間??瓷先?,LocalDateTime和Instant很象,但記得的是“Instant中是不帶時區的即時時間點??赡苡腥苏f,即時的時間點不就是日期+時間么?看上去是這樣的,但還是有所區別,比如LocalDateTime對于用戶來說,可能就只是一個簡單的日期和時間的概念,考慮如下的例子:兩個人都在2013年7月2日11點出生,***個人是在英國出生,而第二個是在加尼福利亞,如果我們問他們是在什么時候出生的話,則他們看上去都是在同樣的時間出生(就是LocalDateTime所表達的),但如果我們根據時間線(如格林威治時間線)去仔細考察,則會發現在出生的人會比在英國出生的人稍微晚幾個小時(這就是Instant所表達的概念,并且要將其轉換為UTC格式的時間)。除此之外,LocalDateTime的用法和上述介紹的其他類都很相似,如下例子所示:
LocalDateTime localDateTime = LocalDateTime.now(); //當前時間加上25小時3分鐘 LocalDateTime inTheFuture = localDateTime.plusHours(25).plusMinutes(3); // 同樣也可以用在localTime和localDate中 System.out.println(localDateTime.toLocalTime().plusHours(25).plusMinutes(3)); System.out.println(localDateTime.toLocalDate().plusMonths(2)); // 也可以使用實現TemportalAmount接口的Duration類和Period類 System.out.println(localDateTime.toLocalTime().plus(Duration.ofHours(25).plusMinutes(3))); System.out.println(localDateTime.toLocalDate().plus(Period.ofMonths(2)));
上述內容就是如何理解Java 8中時間API,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。