Java 8目前已經開始進入大衆的視線,其中筆者在寫本文以前,留意到其中Java 8預覽版中將會出現新的關於日期和時間的API(遵照JSR 310規範)。在本系列文章中,將對這些新的API進行舉例說明。首先在本文中,將先介紹如下幾個:Instant,LocalDate,LocalTime 和 LocalDateTime。首先看看 Instant 對象的使用方法: java
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() 方法會產生一個新的實例,如: google
Instant instant1 = instant.plus(Duration.ofHours(5).plusMinutes(4)); System.out.println("Instant is immutable, so instant==instant returns: " + (instant == instant1));
其輸出爲: url
Instant is immutable, so instant==instant returns: false
下面是更多的關於計算的例子: spa
//計算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))
其輸出結果爲: code
instant1.compareTo(instant)=1. instant1.isAfter(instant)=true, instant1.isBefore(instant)=false
Localdate 和 LocalTime orm
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中是不帶時區的即時時間點。可能有人說,即時的時間點 不就是日期+時間麼?看上去是這樣的,但仍是有所區別,好比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)));