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

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

    

    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的合體app

        同時表示了日期和時間,單不帶有時區信息,能夠直接建立也能夠經過合併日期和時間對象構造。ide

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類對時間建模的方式ui

        基本上是以Unix元年時間(傳統的設定爲UTC時區1970年1月1日午夜時分)開始所經歷的秒數進行計算。spa

        能夠經過向靜態工廠方法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接口定義瞭如何讀取和操縱爲時間建模的對象的值。orm

    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);
相關文章
相關標籤/搜索