java 核心技術(shù)-12版 卷Ⅰ- 4.2.2 LocalDate類
????在前面的例子中,我們使用了Java標(biāo)準(zhǔn)類庫中的Date 類。Date類的實例有一個狀態(tài),也就是一個特定的時間點(diǎn)。
????盡管在使用 Date類時不必知道這一點(diǎn),但時間是用距離一個固定時間點(diǎn)的毫秒數(shù)(可正可負(fù))表示的,這個時間點(diǎn)就是所謂的紀(jì)元(epoch),它是UTC時間1970年1月1日 00:00:00。UTC 就是Coordinated Universal Time(國際協(xié)調(diào)時間),與大家熟悉的GMT(Greenwich Mean Time,格林尼治時間)一樣,是一種實用的科學(xué)標(biāo)準(zhǔn)時間。
????但是,Date類對于處理人類記錄日期的日歷信息并不是很有用,如“December 31,1999”。這個特定的日期描述遵循Gregorian 陽歷,這是世界上大多數(shù)國家使用的日歷。但是,同樣的這個時間點(diǎn)采用中國或希伯來的陰歷來描述會大不相同,倘若我們有來自火星的顧客,基于他們使用的火星歷來描述這個時間點(diǎn)就更不一樣了。
注釋:有史以來,人類的文明與歷法的設(shè)計息息相關(guān), 日歷要為日期指定名字,指定太陽和月亮的周期次序。要了解有關(guān)世界上各種日歷的有趣解釋,從法國大革命的日歷到瑪雅人計算日期的方法,請參見Nachum Dershowitz 和 Edward M. Reingold 編寫的《Calendrical Calculations》第4版(劍橋大學(xué)出版社,2018年)
????類庫設(shè)計者決定將保存時間與給時間點(diǎn)命名分開。所以,標(biāo)準(zhǔn)Java類庫分別包含了兩個:一個是用來表示時間點(diǎn)的Date類;另一個是用大家熟悉的日歷表示法表示日期的LocalDate類。Java8引入了另外一些類來處理日期和時間的不同方面——有關(guān)內(nèi)容參見卷2第6章。
????將時間度量與日歷分開是一種很好的面向?qū)ο笤O(shè)計。通常,最好使用不同的類表示不同的概念。
????不要使用構(gòu)造器來構(gòu)造器LocalDate 類的對象。實際上,應(yīng)當(dāng)使用靜態(tài)工廠方法(factory method),它會代表你調(diào)用構(gòu)造器。下面的表達(dá)式:
????LocalDate.now();
????會構(gòu)造一個一個新對象,表示構(gòu)造這個對象時的日期。
????可以提供年、月和日來構(gòu)造有對應(yīng)一個特定日期的對象:
????LocalDate.of(1999,12,31);?
????當(dāng)然,通常我們都希望將構(gòu)造的對象存在一個對象變量中:
????LocalDate newYearsEve = LocalDate.of(1999 , 12, 31);
????一旦有了一個LocalDate對象,可以用方法getYear、getMonthValue和 getDayOfMonth 得到年月和日:
????int year = newYearEve.getYear(); // 1999
????int month = newYearEve.getMonthValue(); // 12
????int day = newYearEve.getDayOfMonth();//31
????看起來這似乎沒有多大的意義,因為這正是構(gòu)造對象時使用的那些值。不過,有時候可能有一個計算得到的日期,然后你希望調(diào)用這些方法來了解它的更多信息。例如, plusDays方法會生成一個新的LocalDate,如果把應(yīng)用這個方法的對象稱為當(dāng)前對象,那么這個新日期對象則是距當(dāng)前對象指定天數(shù)的一個新日期:
????LocalDate 類封裝了一些實例字段來維護(hù)所設(shè)置的日期。如果不查看源代碼,就不可能知道類內(nèi)部的日期表示。當(dāng)然,封裝的意義就在于內(nèi)部表示并不重要,重要的是類對外提供的方法。
????注釋:實際上,Date類也有得到年月日的方法,分別是 getYear getMonth 和getDay,不過這些方法已經(jīng)廢棄。當(dāng)類庫設(shè)計者意識到某個方法最初就不該引入時,就把它標(biāo)記為廢棄,不鼓勵使用。
????類庫設(shè)計者意識到應(yīng)當(dāng)單獨(dú)提供類來處理日歷,不過在此之前只寫方法已經(jīng)是Date類的一部分了。Java1.1 中引入較早的一組日歷類時,Date 方法被標(biāo)記為廢棄。雖然仍然可以在程序中使用這些方法,不過如果這樣做,編譯時會出現(xiàn)警告。最好不要使用廢棄的方法,因為將來的某個類庫版本很有可能將它們完全刪除。
????
????提示:JDK提供了jdeprscan工具來檢查你的代碼中是否使用了Java API已經(jīng)廢棄的特性。有關(guān)說明參見??http://docs.oracle.com/en/java/javase/17/docs/specs/man/jdeprscan.html

上期參考代碼