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中文網其他相關文章!