? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 十九、章節(jié)練習(xí)(2)
舉例一種方式:
? ? ? ? ? ? ? ? ? ? ? ?二十渐北、TemporalAdjuster調(diào)節(jié)器的使用
調(diào)節(jié)器TemporalAdjuster與查詢TemporalQuery
with(TemporalAdjuster adjuster)
在上一節(jié)學(xué)習(xí)的with方法中學(xué)習(xí)了可以通過with方法修改日期時間對象中封裝的數(shù)據(jù)危虱,但是有一些時候可能會做一些復(fù)雜的操作转捕,比如說將時間調(diào)整到下個周的周日饭入,下一個工作日各吨,或者本月中的某一天排苍,這個時候可以使用調(diào)節(jié)器TemporalAdjuster來更方便的處理日期沦寂。
with方法有一個重載形式,需要傳入一個TemporalAdjuster對象淘衙,通過查看發(fā)現(xiàn)TemporalAdjuster是一個接口传藏,那么實際上傳入的是這個接口的實現(xiàn)類對象。
在以上的描述中彤守,發(fā)現(xiàn)了一個叫做TemporalAdjusters的類可以給我們提供一些常用的方法毯侦,方法如下:
TemporalAdjusters類中常用靜態(tài)方法的使用
static TemporalAdjuster firstDayofNextMonth()? ?下個月的第一天
static TemporalAdjuster firstDayOfNextYear()? ?下一年的第一天
static TemporalAdjuster firstDayOfYear()? ? 當(dāng)年的第一天
注意:TemporalAdjusters 是一個接口,with方法實際上傳入的是這個饑餓口的實現(xiàn)類對象具垫,TemporalAdjusters并不是TemporalAdjuster的實現(xiàn)類侈离,只不過TemporalAdjusters的靜態(tài)方法實現(xiàn)了TemporalAdjuster,并且將實現(xiàn)類對象返回了筝蚕。
? ? ? ? ? ? ? ? ? ? ? ? ? 二十一卦碾、DayOfWeek枚舉類使用
DayOfWeek是一周中星期幾的枚舉類铺坞,其中封裝了從周一到周日
? ? ? ? ? ? ? ? ? ?二十二、自定義TemporalAdjuster調(diào)節(jié)器
通過Java8本身提供的TemporalAdjusters中的方法可以完成一些常用的操作洲胖,如果要自定義日期時間的更改邏輯济榨,可以通過實現(xiàn)TemporalAdjuster類接口的方式來完成。
1绿映、創(chuàng)建類實現(xiàn)TemporalAdjuster接口
2擒滑、實現(xiàn)TemporalAdjuster中的 adjusterInto()方法,傳入一個日期時間對象绘梦,完成邏輯之后返回日期事件對象橘忱。
3赴魁、通過with方法傳入自定義調(diào)節(jié)器對象完成更改卸奉。
例如:假如員工一個月中領(lǐng)取工資,發(fā)薪日是每個月的15日颖御,如果發(fā)薪日是周末榄棵,則調(diào)整為周五。
? ? ? ? ? ? ? ? ? ? ? ?二十三潘拱、TemporalQuery的應(yīng)用
學(xué)習(xí)的時態(tài)類對象(LocalDate疹鳄,LocalTime)都有一個方法叫做query,可以針對日期進行查詢芦岂,R? ? query(TemporalQuery query)這個方法是一個泛型方法瘪弓,返回的數(shù)據(jù)就是傳入的泛型類的類型,TemporalQuery是一個泛型接口禽最,里面有一個抽象方法是R? ? queryFrom(TemporalAccessor temporal)腺怯,TemporalAccessor是Temporal的父接口,實際上也就是LocalDate,LocalDateTime相關(guān)類的頂級父接口川无,這個queryFrom的方法的實現(xiàn)邏輯就是呛占,傳入一個日期/時間對象通過自定義邏輯返回數(shù)據(jù)。
如果要計劃日期距離某一天特定天數(shù)差距多少天懦趋,可以自定義類實現(xiàn)TemporalQuery接口并且作為參數(shù)傳到query方法中晾虑。
例如:計算當(dāng)前時間距離下一個勞動節(jié)還有多少天?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 二十四仅叫、章節(jié)練習(xí)(3)
? ? ? ? ? ? 二十五帜篇、java.util.Date轉(zhuǎn)換為java.time.LocalDate(1)
對于老項目的改造,需要將Date或者Calendar轉(zhuǎn)換為java.util包中相應(yīng)的類的诫咱,可以根據(jù)本小節(jié)中提供的方法進行改造笙隙。
Java8中的java.time中并沒有提供太多的內(nèi)置方式來轉(zhuǎn)換java.util包中用預(yù)處理標(biāo)準日期和時間的類,我們可以使用Instant類作為中介遂跟,也可以使用java.sql.Date和java.sql.TimeStamp類提供的方法進行轉(zhuǎn)換逃沿。
使用Instant類將java.util.Date轉(zhuǎn)換為java.time.LocalDate
java.time包中并沒有提供很多的方式來進行直接轉(zhuǎn)換婴渡,但是給之前的Date類,Calendar類在java1.8都提供了一個新的方法凯亮,叫做toInstant()边臼,可以將當(dāng)前對象轉(zhuǎn)換為Instant對象,通過給Instan添加時區(qū)信息之后就可以轉(zhuǎn)換為LocalDate對象假消。
? ? ? ?二十六柠并、java.sql.Date與java.sql.Timestamp的轉(zhuǎn)換方式
java.sql.Date類中提供直接轉(zhuǎn)換為LocalDate的方法,toLocalDate()
java.sql.Timestamp類是時間戳對象,通過傳入一個毫秒值對象進行初始化
? ? ? 二十七富拗、java.util.Date轉(zhuǎn)換為java.time.LocalDate方式(2)
將java.util.Date類轉(zhuǎn)換為java.time.LocalDate類的第二種方法
java.sql.Date類提供了轉(zhuǎn)換為LocalDate的方法臼予,那么可以將java.util.Date先轉(zhuǎn)換為java.sql.Date。
通過java.sql.Date的構(gòu)造方法直接傳入一個毫秒值可以構(gòu)造一個java.sql.Date對象啃沪,毫秒值可以通過java.util.Date對象的getTime()方法獲取到粘拾。
? ? ? ? ? ? ? ? ?二十八、Calendar轉(zhuǎn)換為ZonedDateTime
Calendar對象字Java1.1開始提供了一個方法獲取時區(qū)對象的方法创千,getTimeZone()缰雇,要將Calendar對象轉(zhuǎn)換為ZonedDateTime需要先獲取到時區(qū)對象。從Java1.8開始TimeZone類提供了一個方法可以獲取到ZonedId追驴。獲取到ZonedId之后就可以初始化ZOnedDateTime對象了械哟,ZonedDateTime類有一個ofInstant()方法,可以將一個Instant對象和ZonedId對象作為參數(shù)傳入構(gòu)造一個ZonedDateTime對象殿雪。
? ? ? ? ? ? ? ? ?二十九暇咆、Calendar轉(zhuǎn)換為LocalDateTime
java.util.Calendar類轉(zhuǎn)換為java.time.LocalDateTime類
Calendar對象可以獲取到年月日時分秒的信息,這些信息可以作為LocalDateTime構(gòu)造方法的參數(shù)
? ? ? ? ? ? ? ? 三十丙曙、新日期實踐類的parse和format方法
SimpleDateFormat類在剛開始的時候講過了是線程不安全的爸业,所以Java8提供了新的格式化類 DateTimeFormatter
dateTimeFormatter類提供了大量預(yù)定義格式化器,包括常量(如ISO_LOCAL_DATE)河泳,模式字母(如yyyy-MM-dd)以及本地化樣式沃呢。
與SimpleDateFormat不同的是,新版本的日期/時間API的格式化與解析不需要再創(chuàng)建轉(zhuǎn)換器對象了拆挥,通過時間日期對象的parse/format方法可以直接進行轉(zhuǎn)換.
LocalDate類定義的parse和format方法
? ? ? ? ? ? ? ? ? ? ? ? ????三十一薄霜、ofLocalizedDate方法
對日期進行格式化
通過DateTimeFormatter的ofLocalizedDate的方法也可以調(diào)整格式化的方式。
public static DateTimeFormatter ofLocalizedDate(FormatStyle dateStyle) {
? ? Objects.requireNonNull(dataStyle, message:"dateStyle");
? ? return new DateTimeFormatterBuilder().appendLocalized(dateStyle,timeStyle:"null")
? ? ? ? ? ? .toFormatter(ResolverStyle.Smart, IsoChronology.Instance);
}
此方法需要傳入一個FormatStyle類對象纸兔,擦好看后發(fā)現(xiàn)FormaStyle對象是一個枚舉類惰瓜,其中有幾種方式如下:
Full:全顯示(年月日+星期) Long:全顯示(年月日) Medium:縮略顯示(沒有年月日漢字) SHORT:精簡顯示(精簡年+月日)
? ? ? ? ? ? ? ? ? ? ? ? ????????三十二、自定義格式化器
除了系統(tǒng)自帶的方式之外汉矿,也可以通過DateTimeFormatter類提供的ofPattern方式創(chuàng)建自定時格式化器崎坊,格式化的寫法與之前使用SimpleDateFormat相同。