首頁  >  文章  >  Java  >  關於Java8中新特性之日期API的範例詳解

關於Java8中新特性之日期API的範例詳解

黄舟
黄舟原創
2017-07-22 15:50:011490瀏覽

Java 8 在套件java.time下包含了一組全新的時間日期API。以下透過範例跟大家講解java8 新特徵日期api的相關知識,有興趣的朋友一起看看吧

Java 8 在套件java.time下包含了一組全新的時間日期API。下面的範例展示了這組新API裡最重要的一些部分:

1.Clock 時鐘

Clock類別提供了存取當前日期和時間的方法,Clock是時區敏感的,可以用來取代System.currentTimeMillis() 來取得目前的微秒數。某一個特定的時間點也可以使用Instant類別來表示,Instant類別也可以用來建立舊的java.util.Date物件。


Clock clock = Clock.systemDefaultZone();
long millis = clock.millis();
Instant instant = clock.instant();
Date legacyDate = Date.from(instant);  // legacy java.util.Date

2.Timezones 時區

在新API時區使用ZoneId來表示。時區可以很方便的使用靜態方法of來取得。 時區定義了到UTS時間的時間差,在Instant時間點物件到本地日期物件之間轉換的時候是極為重要的。


System.out.println(ZoneId.getAvailableZoneIds());
// prints all available timezone ids
ZoneId zone1 = ZoneId.of("Europe/Berlin");
ZoneId zone2 = ZoneId.of("Brazil/East");
System.out.println(zone1.getRules());
System.out.println(zone2.getRules());
// ZoneRules[currentStandardOffset=+01:00]
// ZoneRules[currentStandardOffset=-03:00]

3.LocalTime 本地時間

LocalTime 定義了一個沒有時區資訊的時間,例如晚上10點,或17:30:15。下面的範例使用前面程式碼建立的時區建立了兩個本地時間。之後比較時間並以小時和分鐘為單位計算兩個時間的時間差:


LocalTime now1 = LocalTime.now(zone1);
LocalTime now2 = LocalTime.now(zone2);
System.out.println(now1.isBefore(now2)); // false
long hoursBetween = ChronoUnit.HOURS.between(now1, now2);
long minutesBetween = ChronoUnit.MINUTES.between(now1, now2);
System.out.println(hoursBetween);    // -3
System.out.println(minutesBetween);   // -239

LocalTime 提供了多種工廠方法來簡化物件的創建,包括解析時間字符串。


LocalTime localTime= LocalTime.of(23, 59, 59);
System.out.println(localTime);    // 23:59:59
DateTimeFormatter germanFormatter =
  DateTimeFormatter
    .ofLocalizedTime(FormatStyle.SHORT)
    .withLocale(Locale.GERMAN);
LocalTime leetTime = localTime.format(germanFormatter);
System.out.println(leetTime);

4.LocalDate 本地日期

LocalDate 表示了一個確切的日期,例如2014- 03-11。此物件值是不變的,用起來和LocalTime基本上一致。以下的範例展示如何為Date物件加減天/月/年。另外要注意的是這些物件是不可變的,操作傳回的總是一個新實例。


LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);
LocalDate yesterday = tomorrow.minusDays(2);
LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4);
DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();
System.out.println(dayOfWeek);  // FRIDAY

從字串解析一個LocalDate類型和解析LocalTime一樣簡單:


DateTimeFormatter germanFormatter =
  DateTimeFormatter
    .ofLocalizedDate(FormatStyle.MEDIUM)
    .withLocale(Locale.GERMAN);
LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter);
System.out.println(xmas);  // 2014-12-24

#5.LocalDateTime 本地日期時間

LocalDateTime 同時表示了時間和日期,相當於前兩節內容合併到一個物件上了。 LocalDateTime跟LocalTime還有LocalDate一樣,都是不可變的。 LocalDateTime提供了一些能存取具體欄位的方法。


LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59);
DayOfWeek dayOfWeek = sylvester.getDayOfWeek();
System.out.println(dayOfWeek);   // WEDNESDAY
Month month = sylvester.getMonth();
System.out.println(month);     // DECEMBER
long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY);
System.out.println(minuteOfDay);  // 1439

只要附加上時區信息,就可以將其轉換為一個時間點Instant對象,Instant時間點對象可以很容易的轉換為老式的java.util. Date。


Instant instant = sylvester
    .atZone(ZoneId.systemDefault())
    .toInstant();
Date legacyDate = Date.from(instant);
System.out.println(legacyDate);   // Wed Dec 31 23:59:59 CET 2014

格式化LocalDateTime和格式化時間和日期一樣的,除了使用預先定義好的格式外,我們也可以自己定義格式:


DateTimeFormatter formatter =
  DateTimeFormatter
    .ofPattern("MMM dd, yyyy - HH:mm");
LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter);
String string = formatter.format(parsed);
System.out.println(string);   // Nov 03, 2014 - 07:13

和java.text.NumberFormat不一樣的是新版的DateTimeFormatter是不可變的,所以它是執行緒安全的。

以上是關於Java8中新特性之日期API的範例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn