Swift基礎(chǔ)庫(kù)時(shí)間小分隊(duì)
時(shí)間問(wèn)題是任何一個(gè)語(yǔ)言都繞不開(kāi)的領(lǐng)域吠冤。
Swift基礎(chǔ)庫(kù)提供了多個(gè)類型枢舶,他們共同作用解決時(shí)間問(wèn)題捐韩。與某些語(yǔ)言只有一兩個(gè)核心時(shí)間類型相比职抡,Swift時(shí)間管理相對(duì)復(fù)雜膏孟, 所以我們要理清楚他們之間的相互關(guān)系眯分,才能發(fā)揮其強(qiáng)大作用。
Swift的時(shí)間類型矩陣包括時(shí)間表示柒桑、歷法計(jì)算弊决、文本顯示(格式化)等,他們的關(guān)系是逐級(jí)支撐的魁淳,如時(shí)間表示是基礎(chǔ)能力飘诗,在此能力之上再通過(guò)特定歷法把時(shí)間轉(zhuǎn)化為人們能夠使用的組件,格式化文本進(jìn)一步轉(zhuǎn)化為可讀寫(xiě)的字符串先改。
時(shí)間表示
- Date:表示某個(gè)時(shí)間點(diǎn)疚察,即一維時(shí)間軸上的某個(gè)絕對(duì)點(diǎn)。是純粹表達(dá)時(shí)間的類型仇奶,和任何具體的日歷貌嫡、時(shí)區(qū)或者本地化無(wú)關(guān)。 需要通過(guò)特定Calendar(日歷系統(tǒng))轉(zhuǎn)化為人們能夠理解的概念该溯,如2022年1月2日14時(shí)2分11秒岛抄。
- DateInteval: 用起始時(shí)間和結(jié)束時(shí)間表示的一個(gè)時(shí)間跨度: [起始時(shí)間Date,結(jié)束時(shí)間Date]是一個(gè)封閉的周期狈茉。 結(jié)束時(shí)間可以等于或者晚于起始時(shí)間夫椭,但不能早于起始時(shí)間。這個(gè)類型是對(duì)Date表示一個(gè)時(shí)間點(diǎn)的補(bǔ)充氯庆,它表現(xiàn)出了一個(gè)時(shí)間跨度蹭秋。
- TimeInterval: 用秒表示的時(shí)間間隔,Double類型堤撵。
注意仁讨,swift中的Date表達(dá)的是我們?nèi)粘V兴f(shuō)的時(shí)間概念。 Swift基礎(chǔ)庫(kù)中并沒(méi)有Time這一類型实昨。
Date表示一個(gè)獨(dú)立于任何歷法系統(tǒng)的時(shí)間點(diǎn)洞豁, DateInterval表示一個(gè)被起始時(shí)間和結(jié)束時(shí)間規(guī)定的時(shí)間跨度,TimeInterval是以秒為單位的一個(gè)數(shù)值,表示時(shí)間跨度的大小丈挟。這三個(gè)概念合起來(lái)刁卜,在沒(méi)有任何歷法系統(tǒng)的基礎(chǔ)上可以表示任何時(shí)間的點(diǎn)(點(diǎn))、始終跨度(線段)和長(zhǎng)度(長(zhǎng)度)曙咽。
歷法計(jì)算
- Calendar:日歷系統(tǒng)蛔趴,把時(shí)間點(diǎn)轉(zhuǎn)化為人們?nèi)菀桌斫狻⒎奖阌洃浐徒涣鞯谋磉_(dá)系統(tǒng)例朱,以及反向的轉(zhuǎn)化夺脾。
- DateComponents: 時(shí)間組件,把時(shí)間的組件氛圍年月日時(shí)分秒茉继,并用Calendar系統(tǒng)轉(zhuǎn)化為具體的時(shí)間咧叭。
- TimeZone: 定義了在不同時(shí)區(qū)之間進(jìn)行時(shí)間轉(zhuǎn)化的行為規(guī)則。 主要包括指定時(shí)區(qū)于格林威治標(biāo)準(zhǔn)時(shí)間的偏移量烁竭,以及時(shí)區(qū)特定的英文縮寫(xiě)和識(shí)別符菲茬。
Swift使用Calendar、DateComponents和TimeZone三種類型派撕,把物理上的時(shí)間概念和人們?nèi)粘J褂玫臍v法系統(tǒng)及時(shí)區(qū)對(duì)應(yīng)起來(lái)婉弹。這三個(gè)類型可以比作密碼破譯機(jī)器,將不可讀的Date等類型终吼,翻譯成人們能夠理解的日期和時(shí)間概念镀赌。
人們理解和使用時(shí)間,必須通過(guò)使用歷法系統(tǒng)际跪。swift使用Calendar類型來(lái)處理歷法商佛。Calendar通過(guò)不同的識(shí)別符創(chuàng)建,我們最常用的如gregorian代表公歷姆打,chinese代表中國(guó)農(nóng)歷等良姆。 也可以通過(guò)current/autoupdatingCurrent方法來(lái)獲取當(dāng)前系統(tǒng)使用的歷法。
Calendar的拆解組件功能可以從時(shí)間或者時(shí)間周期拆解出相應(yīng)的歷法組件(年月日時(shí)分秒等)幔戏。相關(guān)的成員函數(shù)有component (拆解出單個(gè)組件)和dateComponents(針對(duì)時(shí)間點(diǎn)或者時(shí)間跨度拆解出多個(gè)組件)玛追,也可以比較一個(gè)Date和一個(gè)DateComponents是否符合。
反過(guò)來(lái)闲延,Calendar的組裝時(shí)間功能可以從提供的時(shí)間組件中計(jì)算出對(duì)應(yīng)的時(shí)間點(diǎn)痊剖,這是由一系列的date成員函數(shù)提供的。 其中包括設(shè)置某些組件或在組件基礎(chǔ)上增加數(shù)值的不同途徑獲取新時(shí)刻垒玲。
Calendar提供了計(jì)算時(shí)間跨度的功能陆馁。如提供某一個(gè)時(shí)間點(diǎn)針對(duì)特定時(shí)間組件的時(shí)間跨度(通過(guò)DateInterval或inout參數(shù)返回),以及特定周末的時(shí)間跨度等侍匙。 這些函數(shù)很多包含dateInterval字串氮惯。
Calendar的掃描時(shí)間功能提供了重復(fù)枚舉時(shí)間組件(及組合)的功能,如重復(fù)每天或每小時(shí)想暗,在符合重復(fù)條件時(shí)可調(diào)用closure的功能妇汗。 Calendar提供了計(jì)算某個(gè)時(shí)間所在天的最早時(shí)刻功能。
Calendar提供了時(shí)間比較功能说莫。 時(shí)間比較時(shí)基于提供的粒度屬性杨箭,提供了知道此粒度的比較結(jié)果。例如储狭,粒度組件參數(shù)設(shè)置為小時(shí)互婿,則比較從最大的時(shí)間組件向下比較到小時(shí)結(jié)束,不往下進(jìn)行辽狈。 此功能模塊還提供了兩個(gè)時(shí)間點(diǎn)是否在一天慈参、某個(gè)時(shí)間點(diǎn)是否在今天、昨天刮萌、明天或者周末的能力驮配。
Calendar還提供了其他瑣碎功能,如比較兩個(gè)日歷系統(tǒng)是否一致着茸、獲取上下午壮锻、星期、月涮阔、季猜绣、公元等符號(hào)。
可以通過(guò)屬性直接獲取的Calendar信息包括標(biāo)識(shí)字符串敬特、時(shí)區(qū)掰邢、區(qū)域設(shè)置、周起始日伟阔、第一周最少天數(shù)尸变、時(shí)間組件的最大和最小范圍、某個(gè)時(shí)間點(diǎn)較小時(shí)間組件在較大時(shí)間組件的序數(shù)和范圍等减俏。
DateComponents的初始化比較難理解的一點(diǎn)是如果某一組件或者calendar召烂、timeZone沒(méi)有給初始值(默認(rèn)為nil),那它對(duì)應(yīng)的時(shí)間是怎么計(jì)算的娃承。 又或者如果某兩個(gè)組件數(shù)值相互沖突奏夫,如日期和周幾的數(shù)值不一致,是如何處理的历筝。 結(jié)論是calendar參數(shù)是必須要提供的酗昼,否則其他函數(shù)都不能返回有效值。在有calendar參數(shù)的情況下梳猪,其他參數(shù)缺失也能提供默認(rèn)值為0或者1麻削, 從而可以返回有效的date蒸痹;即使參數(shù)沖突、或者參過(guò)限度呛哟,時(shí)間是否合法的判斷函數(shù)返回false叠荠,其他獲取組件的函數(shù)仍然能夠工作,甚至能否返回對(duì)應(yīng)的date扫责。
DateComponents同時(shí)提供了訪問(wèn)和設(shè)置各個(gè)子屬性值的方法榛鼎。
TimeZone可以通過(guò)current和autoupdatingCurrent兩個(gè)方法獲取當(dāng)前系統(tǒng)的時(shí)區(qū),后一種會(huì)跟隨系統(tǒng)設(shè)置的變化自動(dòng)調(diào)整鳖孤。
TimeZone的初始化可以通過(guò)識(shí)別符者娱、縮寫(xiě),或者與GMT的秒差創(chuàng)建苏揣。 TimeZone提供了類型函數(shù)來(lái)列舉所有已知的識(shí)別符和縮寫(xiě)字典黄鳍。
TimeZone提供了對(duì)識(shí)別符、縮寫(xiě)平匈、和GMT的秒差等信息际起,及對(duì)夏令時(shí)的一些操作。
格式化文本
- DateFormatter:時(shí)間的格式化吐葱,提供了時(shí)刻Date和它的文本表示之間的對(duì)應(yīng)和轉(zhuǎn)換街望。
- DateComponentsFormatter: 時(shí)間組件的格式化。
- DateIntervalFormatter:時(shí)間間隔的格式化弟跑。
- ISO8601DateFormatter: 基于8601國(guó)際標(biāo)準(zhǔn)的時(shí)間格式化灾前。
DateFormatter提供了字符串和時(shí)間時(shí)間的互相轉(zhuǎn)換。
可以通過(guò)兩種方法設(shè)置時(shí)間表達(dá)字符串的格式孟辑,一個(gè)是通過(guò)dateStyle和timeStyle屬性哎甲;另外一種方法是通過(guò)fixed的方法,dateFormat輸入格式字串饲嗽。
DateFormater可以操作的屬性包括: 歷法系統(tǒng)炭玫、 區(qū)域設(shè)置、時(shí)區(qū)貌虾、兩位數(shù)字的起始時(shí)間吞加、公歷起始時(shí)間等等,以及獲取上下午尽狠、星期衔憨、月和季度的表示符號(hào)等。
時(shí)間組件的文本表示通過(guò)DateComponentsFormatter完成袄膏。 此類的方法不僅有把時(shí)間轉(zhuǎn)化為字符串的方法践图,還另外包括將時(shí)間跨度格式為字符串。
DateIntervalFormatter是對(duì)時(shí)間跨度進(jìn)行格式化的類型沉馆。
ISO8601Formatter是基于國(guó)際標(biāo)準(zhǔn)的日期和時(shí)間與文本相互轉(zhuǎn)化工具码党。
Locale區(qū)域設(shè)置中德崭,有關(guān)于時(shí)間的部分,包括時(shí)間的文本顯示揖盘、時(shí)區(qū)眉厨、歷法、周首日等扣讼。