国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

JDK1.8-新的日期和時(shí)間API

番茄西紅柿 / 3812人閱讀

摘要:這個(gè)月的天數(shù)是否事閏年似地,一天中的時(shí)間,比如,可以使用類(lèi)表示。使用靜態(tài)方法,你可以實(shí)現(xiàn)這一目的合并日期和時(shí)間這個(gè)復(fù)合類(lèi)名叫,是和的合體。對(duì)于最常見(jiàn)的用例,日期和時(shí)間已經(jīng)提供了大量預(yù)定義的。

Java的API提供了很多有用的組件,能幫助你構(gòu)建復(fù)雜的應(yīng)用。不過(guò),Java API也不總是完美的。我們相信大多數(shù)有經(jīng)驗(yàn)的程序員都會(huì)贊同Java 8之前的庫(kù)對(duì)日期和時(shí)間的支持就非常不理想。然而,你也不用太擔(dān)心:Java 8中引入全新的日期和時(shí)間API就是要解決這一問(wèn)題。

1 LocalDate 、 LocalTime 、 Instant 、 Duration 以及 Period

讓我們從探索如何創(chuàng)建簡(jiǎn)單的日期和時(shí)間間隔入手。 java.time 包中提供了很多新的類(lèi)可以幫你解決問(wèn)題,它們是 LocalDate 、 LocalTime 、 Instant 、 Duration 和 Period 。

1.1 LocalDate 和 LocalTime

LocalDate 類(lèi),該類(lèi)的實(shí)例是一個(gè)不可變對(duì)象,它只提供了簡(jiǎn)單的日期,并不含當(dāng)天的時(shí)間信息。另外,它也不附帶任何與時(shí)區(qū)相關(guān)的信息。

你可以通過(guò)靜態(tài)工廠方法 of 創(chuàng)建一個(gè) LocalDate 實(shí)例。 LocalDate 實(shí)例提供了多種方法來(lái)讀取常用的值,比如年份、月份、星期幾等。

public static void main(String[] args) {
        //2014-3-18
        LocalDate date = LocalDate.of(2014, 3, 18);
        //2014
        int year = date.getYear();
        //march
        Month month = date.getMonth();
        //18
        int day = date.getDayOfMonth();
        DayOfWeek dow = date.getDayOfWeek();
        //這個(gè)月的天數(shù)
        int len = date.lengthOfMonth();
        //是否事閏年
        boolean leap = date.isLeapYear();
        System.out.println("year : " + year + " month : " + month + " day : " + day +
                " dow : " + dow + " len : " + len + " leap : " + leap);
    }

似地,一天中的時(shí)間,比如13:45:20,可以使用 LocalTime 類(lèi)表示。你可以使用 of 重載的兩個(gè)工廠方法創(chuàng)建 LocalTime 的實(shí)例。第一個(gè)重載函數(shù)接收小時(shí)和分鐘,第二個(gè)重載函數(shù)同時(shí)還接收秒。同 LocalDate 一樣, LocalTime 類(lèi)也提供了一些 getter 方法訪問(wèn)這些變量的值。

LocalTime time = LocalTime.of(13, 45, 20);
int hour = time.getHour();
int minute = time.getMinute();
int second = time.getSecond();

LocalDate 和 LocalTime 都可以通過(guò)解析代表它們的字符串創(chuàng)建。使用靜態(tài)方法 parse ,你可以實(shí)現(xiàn)這一目的:

LocalDate date = LocalDate.parse("2014-03-18");
LocalTime time = LocalTime.parse("13:45:20");

1.2 合并日期和時(shí)間

這個(gè)復(fù)合類(lèi)名叫 LocalDateTime ,是 LocalDate 和 LocalTime 的合體。它同時(shí)表示了日期和時(shí)間,但不帶有時(shí)區(qū)信息,你可以直接創(chuàng)建,也可以通過(guò)合并日期和時(shí)間對(duì)象構(gòu)造。

// 2014-03-18T13:45:20
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);

通過(guò)它們各自的 atTime 或者 atDate 方法,向 LocalDate 傳遞一個(gè)時(shí)間對(duì)象,或者向LocalTime 傳遞一個(gè)日期對(duì)象的方式,你可以創(chuàng)建一個(gè) LocalDateTime 對(duì)象。你也可以使用toLocalDate 或者 toLocalTime 方法,從 LocalDateTime 中提取 LocalDate 或者 LocalTime組件:

LocalDate date1 = dt1.toLocalDate();
LocalTime time1 = dt1.toLocalTime();

1.3 Duration 和 Period

Duration 類(lèi)的靜態(tài)工廠方法 between 就是為比較兩個(gè)時(shí)間而設(shè)計(jì)的。你可以創(chuàng)建兩個(gè) LocalTimes 對(duì)象、兩個(gè) LocalDateTimes對(duì)象,或者兩個(gè) Instant 對(duì)象之間的 duration:

Duration d1 = Duration.between(time1, time2);
Duration d1 = Duration.between(dateTime1, dateTime2);

如果你需要以年、月或者日的方式對(duì)多個(gè)時(shí)間單位建模,可以使用 Period 類(lèi)。使用該類(lèi)的工廠方法 between ,你可以使用得到兩個(gè) LocalDate 之間的時(shí)長(zhǎng):

Period tenDays = Period.between(LocalDate.of(2014, 3, 8),
								LocalDate.of(2014, 3, 18));

最后, Duration 和 Period 類(lèi)都提供了很多非常方便的工廠類(lèi),直接創(chuàng)建對(duì)應(yīng)的實(shí)例;換句話(huà)說(shuō),就像下面這段代碼那樣,不再是只能以?xún)蓚€(gè)temporal對(duì)象的差值的方式來(lái)定義它們的對(duì)象。

Duration threeMinutes = Duration.ofMinutes(3);
Duration threeMinutes = Duration.of(3, ChronoUnit.MINUTES);
Period tenDays = Period.ofDays(10);
Period threeWeeks = Period.ofWeeks(3);
Period twoYearsSixMonthsOneDay = Period.of(2, 6, 1);

Duration 類(lèi)和 Period 類(lèi)共享方法

2 操縱、解析和格式化日期

2.1 比較直觀的方式操縱 LocalDate 的屬性

		//2019-3-20
        LocalDate of = LocalDate.of(2019, 3, 20);
        //2018-3-20
        LocalDate localDate = of.withYear(2018);
        //2018-4-20
        LocalDate localDate1 = localDate.withMonth(4);
        //2018-9-20
        LocalDate with = localDate1.with(ChronoField.MONTH_OF_YEAR, 9);

最后這一行中使用的 with 方法和get方法有些類(lèi)似,它們都聲明于 Temporal 接口,所有的日期和時(shí)間API類(lèi)都實(shí)現(xiàn)這兩個(gè)方法,它們定義了單點(diǎn)的時(shí)間,比如 LocalDate 、 LocalTime 、 LocalDateTime 以及 Instant 。更確切 地說(shuō),使用 get 和 with 方法,我們可以將 Temporal 對(duì)象值的讀取和修改區(qū)分開(kāi)。

2.2 以相對(duì)方式修改 LocalDate 對(duì)象的屬性

//2014-3-18
LocalDate date1 = LocalDate.of(2014, 3, 18);
//2014-3-25
LocalDate date2 = date1.plusWeeks(1);

LocalDate date3 = date2.minusYears(3);
LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS);

最后一行使用的 plus 方法也是通用方法,它和 minus 方法都聲明于 Temporal 接口中。通過(guò)這些方法,對(duì) TemporalUnit 對(duì)象加上或者減去一個(gè)數(shù)字,我們能非常方便地將 Temporal 對(duì)象前溯或者回滾至某個(gè)時(shí)間段,通過(guò)ChronoUnit 枚舉我們可以非常方便地實(shí)現(xiàn) TemporalUnit 接口。

2.3 使用 TemporalAdjuster

有的時(shí)候,你需要進(jìn)行一些更加復(fù)雜的操作,比如,將日期調(diào)整到下個(gè)周日、下個(gè)工作日,或者是本月的最后一天。這時(shí),你可以使用重載版本的 with 方法,向其傳遞一個(gè)提供了更多定制化選擇的 TemporalAdjuster 對(duì)象,更加靈活地處理日期。對(duì)于最常見(jiàn)的用例,日期和時(shí)間API已經(jīng)提供了大量預(yù)定義的TemporalAdjuster 。你可以通過(guò) TemporalAdjuster 類(lèi)的靜態(tài)工廠方法訪問(wèn)它們。

//2014-03-18
LocalDate date1 = LocalDate.of(2014, 3, 18);
//2014-03-23
LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY));
//2014-03-31
LocalDate date3 = date2.with(lastDayOfMonth());

正如我們看到的,使用 TemporalAdjuster 我們可以進(jìn)行更加復(fù)雜的日期操作,而且這些方 法的名稱(chēng)也非常直觀,方法名基本就是問(wèn)題陳述。此外,即使你沒(méi)有找到符合你要求的預(yù)定義的 TemporalAdjuster ,創(chuàng)建你自己的 TemporalAdjuster 也并非難事。實(shí)際上, Temporal- Adjuster 接口只聲明了單一的一個(gè)方法(這使得它成為了一個(gè)函數(shù)式接口)。

@FunctionalInterface
public interface TemporalAdjuster {
	Temporal adjustInto(Temporal temporal);
}

這意味著 TemporalAdjuster 接口的實(shí)現(xiàn)需要定義如何將一個(gè) Temporal 對(duì)象轉(zhuǎn)換為另一個(gè) Temporal 對(duì)象。你可以把它看成一個(gè) UnaryOperator

2.4 實(shí)現(xiàn)一個(gè)定制的 TemporalAdjuster

設(shè)計(jì)一個(gè) NextWorkingDay 類(lèi),該類(lèi)實(shí)現(xiàn)了 TemporalAdjuster 接口,能夠計(jì)算明天的日期,同時(shí)過(guò)濾掉周六和周日這些節(jié)假日。格式如下所示:

public class MyTemporalAdjuster {
    public static void main(String[] args) {
        LocalDate of = LocalDate.of(2019, 3, 20);
        LocalDate with = of.with(new NewTemporalAdjuster());
        System.out.println("with = " + with);
    }
}

//如果當(dāng)天的星期介于周一至周五之間,日期向后移動(dòng)一天;如果當(dāng)天是周六或者周日,則返回下一個(gè)周一
class  NewTemporalAdjuster implements TemporalAdjuster {
    @Override
    public Temporal adjustInto(Temporal temporal) {
        DayOfWeek of = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
        int dayToAdd = 1;
        if (of == DayOfWeek.FRIDAY){
            dayToAdd = 3;
        }else if (of == DayOfWeek.SATURDAY){
            dayToAdd = 2;
        }
        return temporal.plus(dayToAdd, ChronoUnit.DAYS);
    }
}

2.5 打印輸出及解析日期--時(shí)間對(duì)象

處理日期和時(shí)間對(duì)象時(shí),格式化以及解析日期?時(shí)間對(duì)象是另一個(gè)非常重要的功能。新的java.time.format 包就是特別為這個(gè)目的而設(shè)計(jì)的。這個(gè)包中,最重要的類(lèi)是 DateTimeFormatter 。創(chuàng)建格式器最簡(jiǎn)單的方法是通過(guò)它的靜態(tài)工廠方法以及常量。像 BASIC_ISO_DATE和 ISO_LOCAL_DATE 這 樣 的 常 量 是 DateTimeFormatter 類(lèi) 的 預(yù) 定 義 實(shí) 例 。 所 有 的DateTimeFormatter 實(shí)例都能用于以一定的格式創(chuàng)建代表特定日期或時(shí)間的字符串。

LocalDate date = LocalDate.of(2014, 3, 18);
//20140318
String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);
//2014-03-18
String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);

你也可以通過(guò)解析代表日期或時(shí)間的字符串重新創(chuàng)建該日期對(duì)象。所有的日期和時(shí)間API都提供了表示時(shí)間點(diǎn)或者時(shí)間段的工廠方法,你可以使用工廠方法 parse 達(dá)到重創(chuàng)該日期對(duì)象的目的:

LocalDate date1 = LocalDate.parse("20140318",DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date2 = LocalDate.parse("2014-03-18",DateTimeFormatter.ISO_LOCAL_DATE);

2.6 按照某個(gè)模式創(chuàng)建 DateTimeFormatter

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date1 = LocalDate.of(2014, 3, 18);
String formattedDate = date1.format(formatter);
LocalDate date2 = LocalDate.parse(formattedDate, formatter);

LocalDate 的 formate 方法使用指定的模式生成了一個(gè)代表該日期的字符串。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/7163.html

相關(guān)文章

  • JDK1.8-新的日期時(shí)間API

    摘要:這個(gè)月的天數(shù)是否事閏年似地,一天中的時(shí)間,比如,可以使用類(lèi)表示。使用靜態(tài)方法,你可以實(shí)現(xiàn)這一目的合并日期和時(shí)間這個(gè)復(fù)合類(lèi)名叫,是和的合體。對(duì)于最常見(jiàn)的用例,日期和時(shí)間已經(jīng)提供了大量預(yù)定義的。Java的API提供了很多有用的組件,能幫助你構(gòu)建復(fù)雜的應(yīng)用。不過(guò),Java API也不總是完美的。我們相信大多數(shù)有經(jīng)驗(yàn)的程序員都會(huì)贊同Java 8之前的庫(kù)對(duì)日期和時(shí)間的支持就非常不理想。然而,你也不用太...

    番茄西紅柿 評(píng)論0 收藏0
  • JDK1.8-新的日期時(shí)間API

    摘要:這個(gè)月的天數(shù)是否事閏年似地,一天中的時(shí)間,比如,可以使用類(lèi)表示。使用靜態(tài)方法,你可以實(shí)現(xiàn)這一目的合并日期和時(shí)間這個(gè)復(fù)合類(lèi)名叫,是和的合體。對(duì)于最常見(jiàn)的用例,日期和時(shí)間已經(jīng)提供了大量預(yù)定義的。Java的API提供了很多有用的組件,能幫助你構(gòu)建復(fù)雜的應(yīng)用。不過(guò),Java API也不總是完美的。我們相信大多數(shù)有經(jīng)驗(yàn)的程序員都會(huì)贊同Java 8之前的庫(kù)對(duì)日期和時(shí)間的支持就非常不理想。然而,你也不用太...

    superPershing 評(píng)論0 收藏0
  • 還在使用SimpleDateFormat?

    摘要:線程掛起,線程繼續(xù)走,還會(huì)被繼續(xù)使用方法,而這時(shí)用的是線程設(shè)置的值了,而這就是引發(fā)問(wèn)題的根源,出現(xiàn)時(shí)間不對(duì),線程掛死等等。建議為每個(gè)線程創(chuàng)建單獨(dú)的格式實(shí)例。其中工作隊(duì)列使用的是,源碼頭部的注釋中有說(shuō)明截取的部分。 閱讀本文大概需要 3.2 分鐘。 前言 日常開(kāi)發(fā)中,我們經(jīng)常需要使用時(shí)間相關(guān)類(lèi),想必大家對(duì)SimpleDateFormat并不陌生。主要是用它進(jìn)行時(shí)間的格式化輸出和解析,...

    LittleLiByte 評(píng)論0 收藏0
  • 線程池你真不來(lái)了解一下嗎?

    摘要:所以說(shuō)我們的線程最好是交由線程池來(lái)管理,這樣可以減少對(duì)線程生命周期的管理,一定程度上提高性能。線程池不接收新任務(wù),不處理已添加的任務(wù),并且會(huì)中斷正在處理的任務(wù)。當(dāng)所有的任務(wù)已終止,記錄的任務(wù)數(shù)量為,線程池會(huì)變?yōu)闋顟B(tài)。線程池徹底終止的狀態(tài)。 前言 只有光頭才能變強(qiáng) 回顧前面: ThreadLocal就是這么簡(jiǎn)單 多線程三分鐘就可以入個(gè)門(mén)了! 多線程基礎(chǔ)必要知識(shí)點(diǎn)!看了學(xué)習(xí)多線程事半功倍...

    stdying 評(píng)論0 收藏0
  • 慕課網(wǎng)_《ElasticSearch入門(mén)》學(xué)習(xí)總結(jié)

    摘要:時(shí)間年月日星期四說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。那么里面的數(shù)據(jù)就可以分為各種各樣的索引,比如汽車(chē)索引圖書(shū)索引家具索引等等。圖書(shū)索引又可以細(xì)分為各種類(lèi)型,比如科普類(lèi)小說(shuō)類(lèi)技術(shù)類(lèi)等等。具體到每一本書(shū)籍,就是文檔,就是整個(gè)圖書(shū)里面最小的存儲(chǔ)單位。 時(shí)間:2017年09月14日星期四說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:無(wú)學(xué)習(xí)源碼:https...

    notebin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<