細(xì)品Swift:關(guān)于時間的一切(2)

Swift基礎(chǔ)庫時間小分隊

時間問題是任何一個語言都繞不開的領(lǐng)域。

Swift基礎(chǔ)庫提供了多個類型,他們共同作用解決時間問題。與某些語言只有一兩個核心時間類型相比,Swift時間管理相對復(fù)雜, 所以我們要理清楚他們之間的相互關(guān)系,才能發(fā)揮其強大作用。

Swift的時間類型矩陣包括時間表示、歷法計算、文本顯示(格式化)等,他們的關(guān)系是逐級支撐的,如時間表示是基礎(chǔ)能力,在此能力之上再通過特定歷法把時間轉(zhuǎn)化為人們能夠使用的組件,格式化文本進(jìn)一步轉(zhuǎn)化為可讀寫的字符串。

Pasted Graphic 10.png

時間表示

  1. Date:表示某個時間點,即一維時間軸上的某個絕對點。是純粹表達(dá)時間的類型,和任何具體的日歷、時區(qū)或者本地化無關(guān)。 需要通過特定Calendar(日歷系統(tǒng))轉(zhuǎn)化為人們能夠理解的概念,如2022年1月2日14時2分11秒。
  2. DateInteval: 用起始時間和結(jié)束時間表示的一個時間跨度: [起始時間Date,結(jié)束時間Date]是一個封閉的周期。 結(jié)束時間可以等于或者晚于起始時間,但不能早于起始時間。這個類型是對Date表示一個時間點的補充,它表現(xiàn)出了一個時間跨度。
  3. TimeInterval: 用秒表示的時間間隔,Double類型。

注意,swift中的Date表達(dá)的是我們?nèi)粘V兴f的時間概念。 Swift基礎(chǔ)庫中并沒有Time這一類型。

Date表示一個獨立于任何歷法系統(tǒng)的時間點, DateInterval表示一個被起始時間和結(jié)束時間規(guī)定的時間跨度,TimeInterval是以秒為單位的一個數(shù)值,表示時間跨度的大小。這三個概念合起來,在沒有任何歷法系統(tǒng)的基礎(chǔ)上可以表示任何時間的點(點)、始終跨度(線段)和長度(長度)。

歷法計算

  1. Calendar:日歷系統(tǒng),把時間點轉(zhuǎn)化為人們?nèi)菀桌斫?、方便記憶和交流的表達(dá)系統(tǒng),以及反向的轉(zhuǎn)化。
  2. DateComponents: 時間組件,把時間的組件氛圍年月日時分秒,并用Calendar系統(tǒng)轉(zhuǎn)化為具體的時間。
  3. TimeZone: 定義了在不同時區(qū)之間進(jìn)行時間轉(zhuǎn)化的行為規(guī)則。 主要包括指定時區(qū)于格林威治標(biāo)準(zhǔn)時間的偏移量,以及時區(qū)特定的英文縮寫和識別符。

Swift使用Calendar、DateComponents和TimeZone三種類型,把物理上的時間概念和人們?nèi)粘J褂玫臍v法系統(tǒng)及時區(qū)對應(yīng)起來。這三個類型可以比作密碼破譯機器,將不可讀的Date等類型,翻譯成人們能夠理解的日期和時間概念。

人們理解和使用時間,必須通過使用歷法系統(tǒng)。swift使用Calendar類型來處理歷法。Calendar通過不同的識別符創(chuàng)建,我們最常用的如gregorian代表公歷,chinese代表中國農(nóng)歷等。 也可以通過current/autoupdatingCurrent方法來獲取當(dāng)前系統(tǒng)使用的歷法。

Calendar的拆解組件功能可以從時間或者時間周期拆解出相應(yīng)的歷法組件(年月日時分秒等)。相關(guān)的成員函數(shù)有component (拆解出單個組件)和dateComponents(針對時間點或者時間跨度拆解出多個組件),也可以比較一個Date和一個DateComponents是否符合。

反過來,Calendar的組裝時間功能可以從提供的時間組件中計算出對應(yīng)的時間點,這是由一系列的date成員函數(shù)提供的。 其中包括設(shè)置某些組件或在組件基礎(chǔ)上增加數(shù)值的不同途徑獲取新時刻。

Calendar提供了計算時間跨度的功能。如提供某一個時間點針對特定時間組件的時間跨度(通過DateInterval或inout參數(shù)返回),以及特定周末的時間跨度等。 這些函數(shù)很多包含dateInterval字串。

Calendar的掃描時間功能提供了重復(fù)枚舉時間組件(及組合)的功能,如重復(fù)每天或每小時,在符合重復(fù)條件時可調(diào)用closure的功能。 Calendar提供了計算某個時間所在天的最早時刻功能。

Calendar提供了時間比較功能。 時間比較時基于提供的粒度屬性,提供了知道此粒度的比較結(jié)果。例如,粒度組件參數(shù)設(shè)置為小時,則比較從最大的時間組件向下比較到小時結(jié)束,不往下進(jìn)行。 此功能模塊還提供了兩個時間點是否在一天、某個時間點是否在今天、昨天、明天或者周末的能力。

Calendar還提供了其他瑣碎功能,如比較兩個日歷系統(tǒng)是否一致、獲取上下午、星期、月、季、公元等符號。

可以通過屬性直接獲取的Calendar信息包括標(biāo)識字符串、時區(qū)、區(qū)域設(shè)置、周起始日、第一周最少天數(shù)、時間組件的最大和最小范圍、某個時間點較小時間組件在較大時間組件的序數(shù)和范圍等。

DateComponents的初始化比較難理解的一點是如果某一組件或者calendar、timeZone沒有給初始值(默認(rèn)為nil),那它對應(yīng)的時間是怎么計算的。 又或者如果某兩個組件數(shù)值相互沖突,如日期和周幾的數(shù)值不一致,是如何處理的。 結(jié)論是calendar參數(shù)是必須要提供的,否則其他函數(shù)都不能返回有效值。在有calendar參數(shù)的情況下,其他參數(shù)缺失也能提供默認(rèn)值為0或者1, 從而可以返回有效的date;即使參數(shù)沖突、或者參過限度,時間是否合法的判斷函數(shù)返回false,其他獲取組件的函數(shù)仍然能夠工作,甚至能否返回對應(yīng)的date。

DateComponents同時提供了訪問和設(shè)置各個子屬性值的方法。

TimeZone可以通過current和autoupdatingCurrent兩個方法獲取當(dāng)前系統(tǒng)的時區(qū),后一種會跟隨系統(tǒng)設(shè)置的變化自動調(diào)整。
TimeZone的初始化可以通過識別符、縮寫,或者與GMT的秒差創(chuàng)建。 TimeZone提供了類型函數(shù)來列舉所有已知的識別符和縮寫字典。
TimeZone提供了對識別符、縮寫、和GMT的秒差等信息,及對夏令時的一些操作。


Pasted Graphic.png

格式化文本

  1. DateFormatter:時間的格式化,提供了時刻Date和它的文本表示之間的對應(yīng)和轉(zhuǎn)換。
  2. DateComponentsFormatter: 時間組件的格式化。
  3. DateIntervalFormatter:時間間隔的格式化。
  4. ISO8601DateFormatter: 基于8601國際標(biāo)準(zhǔn)的時間格式化。

DateFormatter提供了字符串和時間時間的互相轉(zhuǎn)換。

可以通過兩種方法設(shè)置時間表達(dá)字符串的格式,一個是通過dateStyle和timeStyle屬性;另外一種方法是通過fixed的方法,dateFormat輸入格式字串。
DateFormater可以操作的屬性包括: 歷法系統(tǒng)、 區(qū)域設(shè)置、時區(qū)、兩位數(shù)字的起始時間、公歷起始時間等等,以及獲取上下午、星期、月和季度的表示符號等。

Pasted Graphic 1.png
Pasted Graphic 3.png

時間組件的文本表示通過DateComponentsFormatter完成。 此類的方法不僅有把時間轉(zhuǎn)化為字符串的方法,還另外包括將時間跨度格式為字符串。


Pasted Graphic 4.png

DateIntervalFormatter是對時間跨度進(jìn)行格式化的類型。

Pasted Graphic 5.png

ISO8601Formatter是基于國際標(biāo)準(zhǔn)的日期和時間與文本相互轉(zhuǎn)化工具。

Pasted Graphic 7.png

Locale區(qū)域設(shè)置中,有關(guān)于時間的部分,包括時間的文本顯示、時區(qū)、歷法、周首日等。

Pasted Graphic 8.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容