Java8新特性之:新的日期和時間API
1.LocalDate只提供日期,不含當天時間信息
LocalDate date = LocalDate.of(2018, 5, 03); int year = date.getYear(); Month month = date.getMonth(); int day = date.getDayOfMonth(); DayOfWeek dow = date.getDayOfWeek(); int len = date.lengthOfMonth(); boolean leap = date.isLeapYear(); LocalDate today = LocalDate.now(); int year1 = date.get(ChronoField.YEAR); int month1 = date.get(ChronoField.MONTH_OF_YEAR); int day1 = date.get(ChronoField.DAY_OF_MONTH);
2.LocalTime:一天中的時間
LocalTime time = LocalTime.of(13, 45, 20); int hour = time.getHour(); int minute = time.getMinute(); int second = time.getSecond(); LocalDate localDate = LocalDate.parse("2014-03-24"); LocalTime localTime = LocalTime.parse("14:34:22");
3.LocalDateTime是LocalDate和LocalTime的合體
同時表示了日期和時間,單不帶有時區信息,可以直接創建也可以通過合並日期和時間對象構造。
LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20); LocalDateTime dt2 = LocalDateTime.of(date, time); LocalDateTime dt3 = date.atTime(13, 45, 20); LocalDateTime dt4 = date.atTime(time); LocalDateTime dt5 = time.atDate(date); LocalDate date1 = dt1.toLocalDate(); LocalTime time1 = dt1.toLocalTime();
4.java.time.Instant類對時間建模的方式
基本上是以Unix元年時間(傳統的設定為UTC時區1970年1月1日午夜時分)開始所經歷的秒數進行計算。
可以通過向靜態工廠方法ofEpochSecond傳遞一個代表秒數的值創建一個該類的實例。
Instant instant1 = Instant.ofEpochSecond(3); Instant instant2 = Instant.ofEpochSecond(3, 0); Instant instant3 = Instant.ofEpochSecond(2, 1_000_000);//2秒之後再加上100萬納秒(1秒) Instant instant4 = Instant.ofEpochSecond(4, -1_000_000);//4秒之前的100萬納秒(1秒)
以上類都實現了Temporal接口。Temporal接口定義了如何讀取和操縱為時間建模的對象的值。
5.Duration.between()兩個對象之間的間隔
Duration d1 = Duration.between(time, time1); Duration d2 = Duration.between(dt1, dt2); Duration d3 = Duration.between(instant1, instant2);
6.Period類:以年、月或者日的方式對多個時間單位建模。
Period tenDays = Period.between(LocalDate.of(2014, 3, 8), LocalDate.of(2014, 3, 18)); Duration threeMinutes = Duration.ofMinutes(3); Duration fourMinutes = Duration.of(4, ChronoUnit.MINUTES); Period elevenDays = Period.ofDays(11); Period threeWeeks = Period.ofWeeks(3); Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);
日期-時間類中表示時間間隔的通用方法:
方法名 | 是否是靜態方法 | 方法描述 |
between | 是 | 創建兩個時間點之間的interval |
from | 是 | 由一個臨時時間創建的interval |
of | 是 | 由它的組成部分創建的interval的實例 |
parse | 是 | 由字符串創建的interval的實例 |
addTo | 否 | 創建該interval的副本,並將其疊加到某個指定的temporal對象 |
get | 否 | 讀取該interval的狀態 |
isNegative | 否 | 檢查該interval是否為負值,不包含零 |
isZero | 否 | 檢查該interval的時長是否為零 |
minus | 否 | 通過減去一定的時間創建該interval的副本 |
multipliedBy | 否 | 將interval的值乘以某個標量創建該interval的副本 |
negated | 否 | 以忽略某個時長的方式創建該interval的副本 |
plus | 否 | 以增加某個指定的時長的方式創建該interval的副本 |
subtractFrom | 否 | 從指定的temporal對象中減去該interval |
二. 操縱、解析和格式化
1.LocalDate、LocalTime、LocalDateTime、Instant表示時間點的日期-時間類的通用方法:
他們都不會修改原來的對象。
方法名 | 是否靜態方法 | 描述 |
from | 是 | 依據傳入的Temporal對象創建對象實例 |
now | 是 | 依據系統時鐘創建Temporal |
of | 是 | 由Temporal對象的某個部分創建該對象的實例 |
parse | 是 | 由字符串創建Temporal對象的實例 |
atOffset | 否 | 將Temporal對象和某個時區偏移相結合 |
atZone | 否 | 將Temporal對象和某個時區相結合 |
format | 否 | 使用某個指定的格式器將Temporal對象轉換為字符串(Instant類不提供改方法) |
get | 否 | 讀取Temporal對象的某一部分的值 |
minus | 否 | 創建Temporal對象的一個副本,通過將當前Temporal對象的值減去一定的時長創建該副本 |
plus | 否 | 創建Temporal對象的一個副本,通過將當前Temporal對象的值加上一定的時長創建該副本 |
with | 否 | 以該Temporal對象為模板,對某些狀態進行修改創建該對象的副本 |
2.TemporalAdjuster類中的工廠方法
方法名 | 描述 |
dayOfWeekInMonth | 創建一個新的日期,它的值為同一個月中每一周的第幾天 |
firstDayOfMonth | 創建一個新的日期,它的值為當月的第一天 |
firstDayOfNextMonth | 創建一個新的日期,它的值為下月的第一天 |
firstDayOfNextYear | 創建一個新的日期,它的值為明年的第一天 |
firstDayOfYear | 創建一個新的日期,它的值為當年的第一天 |
firstInMonth | 創建一個新的日期,它的值為同一個月中,第一個符合星期幾要求的值 |
lastDayOfMonth | 創建一個新的日期,它的值為當月的最後一天 |
lastDayOfNextMonth | 創建一個新的日期,它的值為下的最後一天 |
lastDayOfNextYear | 創建一個新的日期,它的值為明年的最後一天 |
lastDayOfYear | 創建一個新的日期,它的值為今年的最後一天 |
lastInMonth | 創建一個新的日期,它的值為同一個月中,最後一個符合星期幾要求的值 |
next/previous | 創建一個新的日期,並將其值設定為日期調整後或調整前,第一個符合指定星期幾要求的日期 |
nextOrSame/previousOrSame | 創建一個新的日期,並將其值設定為日期調整後或調整前,第一個符合指定星期幾要求的日期,如果該日期已經符合要求,直接返回該對象 |
3.打印輸出及解析日期-時間對象
DateTimeFormatter:格式化及解析日期-時間對象。
與老的DateFormat相比較,DateTimeFormatter實例都是線程安全的。所以能夠以單例模式創建格式器實例。
LocalDate date2 = LocalDate.of(2019, 4, 24); String s1 = date2.format(DateTimeFormatter.BASIC_ISO_DATE);//20190424 String s2 = date2.format(DateTimeFormatter.ISO_LOCAL_DATE);//2014-04-24 LocalDate date3 = LocalDate.parse("20190424", DateTimeFormatter.BASIC_ISO_DATE); LocalDate date4 = LocalDate.parse("2019-04-24", DateTimeFormatter.ISO_LOCAL_DATE);
DateTimeFormatter類還支持一個靜態工廠方法,它可以按照某個特定的模式創建格式器
DateTimeFormatter italianFormatter = new DateTimeFormatterBuilder() .appendText(ChronoField.DAY_OF_MONTH) .appendLiteral(". ") .appendText(ChronoField.MONTH_OF_YEAR) .appendLiteral(". ") .appendText(ChronoField.YEAR) .parseCaseInsensitive() .toFormatter(Locale.ITALIAN)
三. 處理不同的時區和歷法
ZoneId:地區ID都為“{區域}/{城市}”的格式,這些地區集合的設定都由英特網編號分配機構(IANA)的時區數據庫提供
ZoneId romeZone = ZoneId.of("Europe/Rome");
ZoneId對象可以與LocalDate、LocateDateTime或者是Instant對象整合起來,構造為一個ZoneDateTime實例,它代表了相對於指定時區的時間點。
LocalDate date7 = LocalDate.of(2014, Month.MARCH, 18); ZonedDateTime zdt1 = date7.atStartOfDay(romeZone); LocalDateTime dateTime = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45); ZonedDateTime zdt2 = dateTime.atZone(romeZone); Instant instant = Instant.now(); ZonedDateTime zdt3 = instant.atZone(romeZone);
Java8新特性之:新的日期和時間API