1. 程式人生 > >Java8新特性之:新的日期和時間API

Java8新特性之:新的日期和時間API

java8 時間日期API

一. LocalDate、LocalTime、Instant、Duration以及Period

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