SwiftDate概況
從Swift發(fā)布起,我們就沒有放棄使用Swift棍鳖。
當(dāng)然,我們希望在項(xiàng)目能夠輕松自如地管理日期和時區(qū)术辐,所以創(chuàng)建SwiftDate
這個類庫。有了“她”在Swift里面優(yōu)雅地處理時間扇丛。
在iOS术吗、macOS、watchOS帆精、tvOS上较屿,以及Swift兼容的平臺上(Linux)都能完美運(yùn)行!
此外卓练,這個類庫是免費(fèi)的隘蝎,開源的!
最新發(fā)布版本
最新版本是4.0.3(Swift3)
最新更新時間:2016-10-03
更新日志:Read CHANGELOG
老版本
如果你使用的是swift2.2或者swift2.3襟企,你可以到GitHub page
主要特點(diǎn)
這部分內(nèi)容是swiftdate里面主要特點(diǎn)的一大亮點(diǎn)嘱么。
- 日期進(jìn)行簡單數(shù)學(xué)運(yùn)算。例如:
aDate + 2.weeks + 1.hour or (1.year - 2.hours + 16.minutes).fromNow()
- 時區(qū)顽悼,地區(qū)和日歷的轉(zhuǎn)換曼振。使用類
DateInRegion
,通過組件和操作符進(jìn)行轉(zhuǎn)化几迄。 - 算術(shù)比較運(yùn)算比較時間。例如冰评,
aDate1 >= aDate2
或者aDate1.isIn(anotherDate, .day)
- 使用時間組件映胁。比如,用你喜歡的時區(qū)格式表述
aDateInRegion.day
或hour
,minutes
等等甲雅, - 最優(yōu)雅的方式進(jìn)行時間和字符串之間的轉(zhuǎn)換解孙。支持自定義(可讀的)和固定格式(ISO8601, AltRSS, RSS, Extended, .NET和一些按照unicode標(biāo)準(zhǔn)的常規(guī)字符串)。
- 用其他時間單位描述一個時間段抛人。比如
120.seconds.in(.minutes) // 2 minutes
- 快捷獲取時間和時間間隔弛姜。(
isYesterday
,isTomorrow
,isBefore()
...) - ...更多令人激動的事情!
環(huán)境要求
目前官方的版本是v4妖枚,一些要求:
- Swift 3.0+
- iOS 8 or later
- macOS 10.10 or later
- watchOS 2.0 or later
- tvOS 9.0 or later
- ...任意安裝Swift3以及Swift的基本庫的平臺
安裝
SwiftDate支持多種安裝方式廷臼。
CocoaPods安裝方式
CocoaPods是一個Objective-C和Swift的依賴管理器。
安裝CocoaPods命令:
$ gem install cocoapods
SwiftDate 4.+的版本需要使用CocoaPods 1.0.1+盅惜。
Podfile文件
在Xcode項(xiàng)目中引入SwiftDate中剩,編輯Podfile新增:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'TargetName' do
pod 'SwiftDate', '~> 4.0'
end
Carthage安裝方式
Carthage是一種非集成的依賴管理器,構(gòu)建依賴抒寂,并提供二元框架。
homebrew安裝Carthage
:
$ brew update
$ brew install carthage
在Xcode項(xiàng)目中使用Carthage引入SwiftDate掠剑,只需要在Cartfile中新增:
github "malcommac/SwiftDate" ~> 4.0
Swift Package Manager安裝
目前還不支持屈芜!
Fork us on GitHub
SwiftDate是開源的類庫,源碼托管在GitHub上朴译。
??下面的姿勢可以為SwiftDate作貢獻(xiàn):
- 抓到一個bug井佑,提供詳細(xì)步驟復(fù)現(xiàn)bug,open一個issue眠寿。
- 提出一個功能性的請求躬翁,open一個issue。
- 貢獻(xiàn)代碼盯拱,提交pr盒发。
- ...
Authors & License
SwiftDate是由Daniele Margutti創(chuàng)建并維護(hù),其中項(xiàng)目的一個主要貢獻(xiàn)者是Jeroen Houtzager狡逢。
歡迎為開源項(xiàng)目作出貢獻(xiàn)宁舰!
此庫的源代碼遵循MIT License, 你可以沒有任何限制地在商業(yè)項(xiàng)目中使用!
唯一的要求就是增加一行說明:
Date and Time Management is provided by SwiftDate - http://www.swift-date.com
Created by Daniele Margutti and licensed under MIT License.
Your App & SwiftDate
如果你有興趣奢浑,可以整理出使用SwiftDate這個類庫的項(xiàng)目蛮艰。可以在GitHub上開一個issue雀彼,提供你的項(xiàng)目名字和鏈接壤蚜,我們將會添加到本網(wǎng)站上即寡!
主要概念
Date 和 Absolute Time
Date
是日期和時間處理的基礎(chǔ)類。在iOS內(nèi)部袜刷,時間以從 2001年1月1日00:00 UTC 的秒數(shù)嘿悬,作為絕對值存儲,Date
對此進(jìn)行封裝水泉,并提供相關(guān)方法善涨。
世界各地的在同一個時刻,你可以認(rèn)為是同一個物體(除非出現(xiàn)了一個新的星球時間系統(tǒng))草则。但是附加上各地不同的表述和計算方式钢拧,時間就變得略微復(fù)雜。
絕對時間一種通俗的概念:在美國的 A 正在跟在迪拜的 B 進(jìn)行通電話炕横,這個時刻就可以稱為絕對時間源内;在同一時刻都會有這樣的通話,但是由于時區(qū)份殿、不用的日歷以及不同的字母或符號方法膜钓,區(qū)域時間就可能不一樣。
基礎(chǔ)庫還支持處理不同的日歷體系的 Calendar
日歷實(shí)例卿嘲;
在處理跨時區(qū)颂斜、日歷種類和區(qū)域的時間轉(zhuǎn)換的時候,都會遇到一些棘手的問題拾枣。SwiftDate能夠幫你更高效的解決這些問題沃疮。
DateInRegion 和 Region
SwiftDate 為了提供完整的時間和日期管理的功能,引入了兩個重要的新玩意以及數(shù)個擴(kuò)展梅肤。
第一個是一個結(jié)構(gòu)體(struct)司蔬,稱為Region
:region,正如其名稱姨蝴,它是對一個地理位置在時間體系中的描述俊啼,其中包含三個不同的特征:
這或許是不太重要的標(biāo)注說明:
GMT(Greenwich Mean Time)
:指格林威治標(biāo)準(zhǔn)時間;
PST(Pacific Standard Time)
:指太平洋標(biāo)準(zhǔn)時間左医;
TimeZone
: 用來定義時區(qū)授帕。時區(qū)在一定程度上表示了不同地區(qū),因此炒辉,地區(qū)的名字的可作為時區(qū)的名稱豪墅,例如夏威夷時區(qū),北京時間黔寇。類似的偶器,格林尼治時間(GMT)或美國西部時間(PST)的偏移量, 也可以用來表示時區(qū),例如東八區(qū)(GMT +8)Calendar
: 用來表示日歷體系屏轰,日歷體系定義了年與月的長度與劃分颊郎。SwiftDate 提供了不同日歷的信息,還支持不同日歷下時間的計算霎苗,例如給出絕對時間值姆吭,SwiftDate 可以確定他在指定日歷系統(tǒng)下的日期。local
: 用來表示當(dāng)?shù)氐臅r間表述方式唁盏。由于各地的文化内狸、語言、規(guī)范的不同厘擂,時間在各地用不同的分隔符或語法來表示昆淡。比如 中國地區(qū)一般采用 年-月-日 時:分:表,而美國地區(qū)多采用 月-日-年 時:分:秒
另一個是DateInRegion
刽严,是在特定的國家地區(qū) Region
下昂灵,描述一個自身與具體時區(qū)和日歷無關(guān)的時間Date
。這是由于特定的國家地區(qū)一般采用固定的時區(qū)舞萄、日歷系統(tǒng)與表述規(guī)范眨补,只要聲明了國家地區(qū),就包含了以上三個要素倒脓。實(shí)際應(yīng)用中撑螺,使用DateInRegion
可以方便的操作上下文中的日期。
SwiftDate 為您提供相同的函數(shù)和屬性把还,以管理帶有地區(qū)屬性的DateInRegion
時間實(shí)例 和 單純Date
時間實(shí)例实蓬。
默認(rèn)Region
當(dāng)你使用普通的Date
對象,你可以在Date.defaultRegion
中定義的DateInRegion吊履,這個地區(qū)包含了:
- .timeZone 以 GMT (Greenwich Mean Time)格式表述的時區(qū)
- .local 以設(shè)備的所在地設(shè)置日期表述方式
- .Calendar 設(shè)置為設(shè)備默認(rèn)的日歷
您可以調(diào)用 Date.setDefaultRegion(:)
以改變時間的默認(rèn)地區(qū) Date.defaultRegion
。
這個或許不太重要但還是要記椎鼢蕖:時間的這些需要在應(yīng)用啟動時設(shè)置好(例如艇炎,在UIApplication的delegate中函數(shù)applicationDidFinishLaunching()
中設(shè)置就行了)。
時間的組件
概況
使用 SwiftDate腾窝,您可以非常方便的操控時間的組件缀踪。無論是否設(shè)置地區(qū)屬性,DateInRegion
和Date
都實(shí)現(xiàn)了同一套屬性和方法來進(jìn)行時間日期的管理虹脯。
請注意:使用簡單時間 Date
實(shí)例時驴娃,實(shí)際上是基于了設(shè)備默認(rèn)的地區(qū)來初始化了 .defaultRegion
。Region.GMT()
是由設(shè)備默認(rèn)的locale
和Calendar
和當(dāng)前設(shè)備所在地的時區(qū)所決定循集,.defaultRegion
的初始值就是Region.GMT()
如果想要修改的默認(rèn)的區(qū)域唇敞,調(diào)用Date
的靜態(tài)方法 .setDefaultRegion()
即可!
補(bǔ)充說明:
時間的這些屬性值需考慮上下文的地區(qū)與日歷系統(tǒng);如果調(diào)用者是DateInRegion
疆柔,SwiftDate 將會使用已經(jīng)指定的.region
來計算具體屬性值咒精,如果調(diào)用者是普通Date
,SwiftDate 將會基于默認(rèn)的Date.defaultRegion
來計算屬性值旷档。以下所有屬性與組件都服從此原則模叙。
era
返回公元狀態(tài),我們?nèi)粘I钪械?2016 年都以公元年為起點(diǎn)鞋屈,這些時間的 era
都為 1
, 而公元前的年份如 -2000 年范咨,這些時間的 era
都是 0
。所以在操作近代時間時厂庇,無需考慮此屬性渠啊。
聲明:
public var era: Int
year
返回年份的數(shù)值
聲明:
public var year: Int
month
返回月份的數(shù)值,如 5
月
聲明:
public var month: Int
day
返回年月日中 日
的數(shù)值宋列,如 30
日
聲明:
public var day: Int
hour
返回時分秒中 時
的數(shù)值
聲明:
public var hour: Int
nearestHour
根據(jù)四舍五入的方法取出時間的最近小時昭抒。簡單舉例:比如 8:15 會返回 8 ,而 8:50 會返回 9
聲明:
public var nearestHour: Int
minute
返回時分秒中 分
的數(shù)值
聲明:
public var minute: Int
second
返回時分秒中 秒
的數(shù)值
聲明:
public var second: Int
nanosecond
返回時間的 毫秒
的數(shù)值
聲明:
public var nanosecond: Int
注意
公歷日歷定義一個星期有7天炼杖,一年有356天灭返,或閏年366天。 然而坤邪,356或366都不平均地分成7天的周熙含,因此通常情況下,一年的最后一周在下一年的一天結(jié)束艇纺,一年的第一周從前一年開始怎静。 為了協(xié)調(diào)這一點(diǎn),ISO 8601定義了一個周編號年份黔衡,包括52或53整周(364或371天)蚓聘,以便一年的第一周被指定為包含一年中第一個星期四的星期。
您可以將yearForWeekOfYear屬性與weekOfYear和weekday屬性配合使用盟劫,以獲取與一年中給定星期的特定工作日對應(yīng)的日期夜牡。 例如,2005年第53周(ISO 2005-W53-6)的第6天對應(yīng)于公歷日歷上2005年1月1日星期六侣签。比如羅馬時間 2015-12-31 15:10:12 他的 yearForWeekOfYear
為 2016
塘装,weekOfYear
為 1
,weekday
為 3
yearForWeekOfYear
在 ISO8601
的周數(shù)計算規(guī)則下影所,日期所屬的年份蹦肴。可能是當(dāng)前日期的前一年猴娩,或者下一年阴幌,或者當(dāng)年勺阐。
聲明:
public var yearForWeekOfYear: Int
weekOfYear
在 ISO 8601 的周數(shù)計算規(guī)則下,日期所屬的周數(shù)裂七。如羅馬時間 2015-11-31 是第 49 周皆看,2015-12-31 是第一周。
聲明:
public var weekOfYear: Int
weekday
在 ISO 8601 的周數(shù)計算規(guī)則下背零,在時間所屬的周中腰吟, 是星期幾,且規(guī)定了 1
是星期日徙瓶,也就是每周的起點(diǎn)是周日毛雇。如羅馬時間 2015-11-31 是星期四 ,其 weekday
為5
侦镇。
聲明:
public var weekday: Int
weekdayOrdinal
以每個月的第一天為當(dāng)月第一周的起點(diǎn)灵疮,無視全年的星期計算規(guī)則,比如每個月第 4 天就是第一周壳繁,第 8 天就是第二周震捣。
聲明:
public var weekdayOrdinal: Int
weekdayName
某個日期的星期名稱,如果你設(shè)定是中國地區(qū)闹炉,那周二為“星期二”蒿赢,日本地區(qū)就是 “火曜日” ,美國地區(qū)就是 “Tuesday”渣触,注意此值取決于地區(qū)屬性羡棵。
聲明:
public var weekdayName: String
monthDays
時間所在月份,該月份的天數(shù)嗅钻,比如公歷中皂冰, 二月 可能有 29 天或 28 天,12 月有 31天养篓。
聲明:
public var monthDays: Int
quarter
返回季度單位的數(shù)值秃流。注意在常識中,一年分為春夏秋冬四季柳弄,但在不同地區(qū)季度的起始時間不同剔应,因此此屬性在沒有賦值的情況下均為 0 ,當(dāng)您需要使用前语御,請賦值。
聲明:
public var quarter: Int
weekOfMonth
返回月份所包含的周數(shù)席怪,此處按照 IOS 8601 的標(biāo)準(zhǔn)应闯,每個月橫跨的周數(shù),比如 2015年2月 的 weekOfMonth
是 4 挂捻,而 2016 年 2 月的 weekOfMonth
是 5 碉纺。
聲明:
public var weekOfMonth: Int
shortMonthName
該時間所在月份的簡稱,比如美國地區(qū) 2月全稱是 February ,簡稱是 Feb 即 2015-02-01 改時間的 shortMonthName
就是 Feb
骨田。
聲明:
public var monthName: Int
leapMonth
返回一個布爾值耿导,說明某個月份是否是閏月。
true
态贤,表示該時間所在月份是閏月舱呻,否則不是閏月。
聲明:
public var leapMonth: Bool
leapYear
返回一個布爾值悠汽,說明某個年份是否是閏年箱吕。
true
,表示該時間所在的年份是閏年柿冲,否則不是閏年茬高。
聲明:
public var leapYear: Bool
補(bǔ)充說明:
這個值將會在其使用的日歷和時區(qū)的環(huán)境中解釋;如果調(diào)用者是DateInRegion
假抄,系統(tǒng)環(huán)境將會使用相關(guān)的.region
來定義怎栽,如果調(diào)用者是普通Date
,系統(tǒng)環(huán)境將會使用默認(rèn)值Date.defaultRegion
來定義宿饱。
julianDay
儒略日 (Julian Day) 是天文學(xué)家使用從朱利安時期以來連續(xù)的天數(shù)熏瞄。詳情請見維基百科詞條 儒略日
聲明:
public var julianDay: Double
modifiedJulianDay
儒略日 (Julian Day) 有一些列的計算方法,由于用途是天文領(lǐng)域,且與公歷換算復(fù)雜,此處不展開敘述走趋,詳情請見維基百科詞條 Julian Day
聲明:
public var modifiedJulianDay: Double
previousWeekend
返回該時間所在周的上個周末渊鞋,這個周末以元組表示,第一個元素是上周末開始的時間坷虑,第二個是上周末的結(jié)束時間。且這兩個時間都是 DateInRegion
實(shí)例。
注意:是上個周的周末柠座,不是時間本來所在周的周末
聲明:
public var previousWeekend: (startDate: DateInRegion, endDate: DateInRegion)?
thisWeekend
返回該時間所在周的周末,這個周末以元組表示片橡,第一個元素是本周末開始的時間妈经,第二個是本周末的結(jié)束時間。且這兩個時間都是 DateInRegion
實(shí)例捧书。
聲明:
public var thisWeekend: (startDate: DateInRegion, endDate: DateInRegion)?
nextWeekend
返回該時間所在周的下個周末吹泡,這個周末以元組表示,第一個元素是下周末開始的時間经瓷,第二個是下周末的結(jié)束時間爆哑。且這兩個時間都是 DateInRegion
實(shí)例。
注意:是下個周的周末舆吮,不是時間本來所在周的周末
聲明:
public var nextWeekend: (startDate: DateInRegion, endDate: DateInRegion)?
isToday
返回布爾值揭朝,返回調(diào)用此屬性的時間實(shí)例是否在今天队贱。
聲明:
public var isToday: Bool
isYesterday
返回布爾值,返回調(diào)用此屬性的時間實(shí)例是否在昨天潭袱。
聲明:
public var isYesterday: Bool
isTomorrow
返回布爾值柱嫌,返回調(diào)用此屬性的時間實(shí)例是否在明天。
聲明:
public var isTomorrow: Bool
isInWeekend
返回布爾值屯换,返回調(diào)用此屬性的時間實(shí)例是否在其所在周的周末時間段內(nèi)编丘。
聲明:
public var isInWeekend: Bool
isInPast
比較該時間實(shí)例與當(dāng)前時間,換算成時間絕對值來趟径,比較大小瘪吏,如果比當(dāng)前時間小,即為過去時間蜗巧,返回 true
掌眠;反之,返回 false
幕屹。簡言之:早于現(xiàn)在時刻的時間 返回 true
蓝丙。
聲明:
public var isInPast: Bool
isInFuture
比較該時間實(shí)例與當(dāng)前時間,換算成時間絕對值來望拖,比較大小渺尘,如果比當(dāng)前時間大,即為將來時間说敏,返回 true
鸥跟;反之,返回 false
盔沫。簡言之:晚于現(xiàn)在時刻的時間 返回 true
医咨。
聲明:
public var isInFuture: Bool
isInSameDayOf()
比較時間實(shí)例與給定的時間是否為在同一天。比較時采用調(diào)用者的時區(qū)和日歷設(shè)置架诞。
聲明:
public func isInSameDayOf(date: DateInRegion) -> Bool
public func isInSameDayOf(date: Date) -> Bool
startOfDay
返回當(dāng)前時間所在 天
的起始時刻拟淮,比如 2016-11-11 23:10:00 的 startOfDay
是 2016-11-11 00:00:00 。注意會結(jié)合時區(qū)和日歷谴忧。
聲明:
public var startOfDay: DateInRegion
public var startOfDay: Date
endOfDay
返回當(dāng)前時間所在 天
的結(jié)束時刻很泊,比如 2016-11-11 23:10:00 的 startOfDay
是 2016-11-11 23:59:59 。注意會結(jié)合時區(qū)和日歷沾谓。
聲明:
public var endOfDay: DateInRegion
public var endOfDay: Date
nextMonth
時間所在月份的下一個月的同一日的起始時間委造,比如 2016-03-31 13:30:00 的 nextMonth
是 2016-04-30 00:00:00,注意 SwiftDate 會自動換算不同月份天數(shù)不同的問題均驶。
聲明:
public var nextMonth: DateInRegion
public var nextMonth: Date
prevMonth
時間所在月份的上一個月的同一日的起始時間争涌,比如 2016-03-31 13:30:00 的 nextMonth
是 2016-02-29 00:00:00,注意 SwiftDate 會自動換算不同月份天數(shù)不同的問題辣恋。
聲明:
public var prevMonth: DateInRegion
public var prevMonth: Date
startOf()
給定一個單位亮垫,返回時間在此單位的起始值,比如給定以年為單位伟骨, 2016-11-11 11:11:11 的 startOf()
是 2016-01-01 00:00:00 饮潦;給定 時 為單位,會反回 2016-11-11 11:00:00
聲明:
public func startOf(component: Calendar.Component) -> DateInRegion
public func startOf(component: Calendar.Component) -> Date
解析與創(chuàng)建時間
概覽
一個關(guān)聯(lián)到具體地區(qū)的時間可以由多種方法創(chuàng)建携狭;這種時間可以由一對 Date
和 Region
組成继蜡,或者從自定義時間格式的字符串解析(SwiftDate 支持自定義的時間格式,諸如 ISO8601 標(biāo)準(zhǔn)格式逛腿,RSS 或AltRSS 和 .NET 時間)稀并,再或者可以通過解析 Calendar.Component
對象的集合來創(chuàng)建。
當(dāng)然你也可以通過數(shù)學(xué)運(yùn)算從另兩個時間來新建時間单默。
本章節(jié)羅列了所有關(guān)于創(chuàng)建時間的方法碘举,無論是否包含地域信息,DateInRegion
和 Date
都適用于這些方法搁廓。
根據(jù)字符串解析時間
眾所周知引颈,解析字時間符串并轉(zhuǎn)換成時間實(shí)例很繁瑣。SwiftDate 支持眾多時間格式境蜕,以幫你提高效率蝙场,減少開銷。
給 format
參數(shù)賦值粱年,以聲明你使用的時間格式:可以是自定義時間格式或 ISO8601 datetime售滤、.NET datetime 等標(biāo)準(zhǔn)化時間格式。
聲明
func init(string: String, format: DateFormat, fromRegion region: Region? = nil) throws
參數(shù)
-
string
: this is the string you want to parse -
format
: this is the format in which you expect the string is formatted.DateFormat
is an enum:.custom
(for custom format),.iso8601
to parse all available specs for ISO8601 DateTime Format,.extended
to parse Extended DateTime format,.rss
to parse both RSS and AltRSS datetime formats and .dotNET to parse .NET datetime strings. -
region
: is the region in which you want to express specified date. If nil or not specified Region.Local(( is used instead.
返回結(jié)果
返回結(jié)果是 包含地區(qū)信息的 DateInRegion
時間實(shí)例台诗。
例子
let rome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italian)
// 基于自定義時間格式解析時間字符串
let date1 = try! DateInRegion(string: "1999-12-31 23:30:00", format: .custom("yyyy-MM-dd HH:mm:ss"), fromRegion: regionRome)
// 基于 AltRss 標(biāo)準(zhǔn)來解析時間字符串
let date2 = try! "3 feb 2001 15:30:00 +0100".date(format: .rss(alt: true), fromRegion: regionRome)
// 同上
let date3 = try! DateInRegion(string: "3 feb 2001 15:30:00 +0100", format: .ss(alt: true)), fromRegion: regionRome)
// 解析 ISO8601 標(biāo)準(zhǔn)互聯(lián)網(wǎng)時間字符串
let date4 = DateInRegion(string: "2001-02-03T15:30:00+01:00", format: .iso8601(options: .withInternetDateTime), fromRegion: regionRome)
// 解析自定義時間格式字符串
let date5 = try! DateInRegion(string: "sab 3 feb 2001, 30 minutes after 15 (timezone is +0100)", format: .custom("eee d MMM YYYY, m 'minutes after' HH '(timezone is' Z')'"), fromRegion: regionRome)
獲取當(dāng)前時刻的時間實(shí)例
使用默認(rèn)的 init()
方法可快捷的創(chuàng)建基于設(shè)備當(dāng)前地區(qū)和時刻的 DateInRegion
時間實(shí)例完箩。
聲明
func init()
返回結(jié)果
返回的 DateInRegion
對象定義了當(dāng)前時刻(Date()
)和設(shè)備當(dāng)前的所在地區(qū),此地區(qū)屬性(Region.Local()
)包含了時區(qū) .timeZone
拉庶、區(qū)域時間格式 .locale
嗜憔、當(dāng)?shù)厝諝v種類 .calendar
(所有相關(guān)設(shè)置都會自動更新)
補(bǔ)充說明:地區(qū) 包含了3個屬性:時區(qū)(如 GMT +8)、當(dāng)?shù)貢r間格式(如中國以 年-月-日氏仗,美國以 月-日-年)吉捶、日歷種類(如公歷、日本日歷皆尔、佛教日歷)
例子
// Create a new DateInRegion which represent the current moment (Date()) in current device's local settings
let now = DateInRegion()
根據(jù)給定的時刻和地區(qū)來創(chuàng)建時間實(shí)例
給定時間和其所在地區(qū)呐舔,你可以創(chuàng)建對應(yīng)的 DateInRegion
對象。創(chuàng)建后慷蠕,使用 DateInRegion
對象進(jìn)行的所有操作珊拼,都將應(yīng)用對應(yīng)地區(qū)的要求;DateInRegion
對應(yīng)的屬性和方法會自動套用區(qū)域的設(shè)置流炕;
聲明
func init(absoluteDate date: Date, in region: Region)
參數(shù)
-
date
: define the absoluteDate
you want to use to create the newDateInRegion
. Passed date is indipendent from any geographic timezone/calendar or locale because it's expressed in absolute time. -
region
: define the destinationRegion
in which you want to express passeddate
返回結(jié)果
返回對象是一個解析自給定地區(qū)的 DateInRegion
時間實(shí)例澎现。
例子
// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
// Resulting object is DateInRegion which express the current moment in Rome
let dateInRome = DateInRegion(absoluteDate: Date(), in: regionRome)
根據(jù)日期要素創(chuàng)建時間
將日歷的因素集合以 DateComponents
對象封裝后創(chuàng)建 DateInRegion
時間是另一種好方法仅胞。DateComponents
實(shí)例化對象的TimeZone
Locale
Calendar
屬性都必須聲明以保證獲得的時間有效;如果缺失任何一個剑辫,將會拋出 .MissingCalTzOrLoc
異常干旧。
聲明
func init(components: DateComponents)
參數(shù)
-
components
: components used to generate the new date
返回結(jié)果
返回一個 DateInRegion
時間實(shí)例,其日期由傳入的 DateComponets
來決定妹蔽;
例子
var cmp = DateComponents()
cmp.timeZone = TimeZoneName.europeOslo.timeZone
cmp.calendar = CalendarName.gregorian.calendar
cmp.calendar?.locale = LocaleName.englishNorway.locale
cmp.year = 2005
cmp.month = 4
cmp.day = 15
cmp.hour = 20
cmp.minute = 30
// create a new DateInRegion on 15 Apr 2005, 20:30:00 GMT+2
let date = try! DateInRegion(components: cmp)
根據(jù)時間組件創(chuàng)建時間
傳入一組 Calendar.Component
與對應(yīng)值組成的數(shù)組(由[Calendar.Component:Int]
樣式的字典和具體的地區(qū)所定義)來創(chuàng)建一個新的 DateInRegion
時間實(shí)例
聲明
func init(components: [Calendar.Component:Int], in region: Region)
參數(shù)
-
components
: components used to generate the new date. It's a dictionary where keys areCalendar.Component
and values areInt
with relative value. Supported components are:.day
,.era
,.hour
,.minute
,.month
,.nanosecond
,.quarter
,.second
,.weekOfMonth
,.weekOfYear
,.weekday
,.weekdayOrdinal
,.year
,.yearForWeekOfYear
椎眯。 -
region
: is the region in which you want to express specified date. If nil or not specified Region.Local(( is used instead.
返回結(jié)果
返回一個 DateInRegion
時間實(shí)例,其組件由傳入的 DateComponets
來決定胳岂;
例子
let c: [Calendar.Component : Int] = [.year: 2002, .month: 3, .hour: 5, .day: 4, .minute: 6, .second: 7, .nanosecond: 87654321]
// create a new DateInRegion on 2002-03-04 at 05:06:07.87654321 (+/-10) in Region.Local()
let date = try! DateInRegion(components: c, fromRegion: nil)
修改時間
SwiftDare 中文版說明文檔 - 修改時間 - 5
@(丁香園學(xué)習(xí)筆記)[swift, 翻譯]
概覽
使用 SwiftDate 來對時間進(jìn)行相關(guān)修改操作十分簡便编整;修改時間組件,比較兩個時間(時間的不同以他們之間的不等組件來表示)乳丰。無論是帶有地區(qū)屬性的 DateInRegion
時間實(shí)例還是單一結(jié)構(gòu)的 Date
時間實(shí)例掌测,都可以進(jìn)行這些操作。
數(shù)學(xué)運(yùn)算
為時間添加組件
你可以使用 Swift 中常用數(shù)學(xué)運(yùn)算符成艘,來增減時間元素的值赏半。如+
、-
根據(jù)你所表達(dá)的上下文淆两,SwiftDate 會自動判斷并生成帶有地區(qū)屬性的 DateInRegion
時間實(shí)例或單一結(jié)構(gòu)的 Date
時間實(shí)例断箫。
可用的時間組件有: nanoseconds
,seconds
,minutes
,hours
,days
,weeks
,years
下面是一些數(shù)學(xué)運(yùn)算的例子:
// 創(chuàng)建一個羅馬時間 2015-01-03 @ 15:10:00
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
var date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// 讓我試試數(shù)學(xué)運(yùn)算符修改時間元素值
date = date + 3.seconds + 15.minutes // -> 03 gen 2015, 15:25:03 CET
date = date - 120.seconds // minus 2 minutes -> 03 gen 2015, 15:23:03 CET
date = date + 3.weeks // 24 gen 2015, 15:23:03 CET
// 你也可以直接增加絕對秒數(shù),SwiftDate 會自動幫你換算
date.add(interval: 10) // 24 gen 2015, 15:23:03 CET
比較時間
概述
在 Swift3 的 Foundation 庫中秋冰,已經(jīng)支持比較 Date
時間實(shí)例仲义。
SwiftDate 為帶有地區(qū)屬性的 DateInRegion
補(bǔ)充了相似的比較方法,并通過添加新方法擴(kuò)充了現(xiàn)有 Foundation 庫對不同粒度下的時間比較剑勾。
比較簡單時間
你可以使用 >
,>=
,<
,=<
運(yùn)算符來比較時間埃撵,例如:
// 03 gen 2015, 15:10:00 CET
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let date2 = try! DateInRegion(components: [.year: 2015, .month: 2, .day: 5, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
if date2 > date1 { // DateInRegion supports Equatable protocol you can use >=, <=, < or >
print("'\(date2)' date is later than '\(date1)'")
}
if date2 == date1 {
// simple equality
}
時間所對應(yīng)的單位起始值
概述
利用 .startOf()
方法,傳入計算單位后虽另,你可以獲得改時間到現(xiàn)在的差值暂刘。補(bǔ)充說明:時間是一個點(diǎn)值,而時間的單位都是一段時間的差值捂刺,這里的起始值指的就是時間點(diǎn)值在時間單位的區(qū)間中的左邊界值谣拣;比如,2016-11-11 20:39:50 族展,以月為單位森缠,起始值是 2016-11-01 00:00:00;以小時為單位 仪缸,起始值是 2016-11-11 20:00:00贵涵。
聲明
startOf(component: Calendar.Component) -> DateInRegion
startOf(component: Calendar.Component) -> Date
參數(shù)
-
component
: component to alter
返回值
返回給定時間單位區(qū)間的起始值所對應(yīng)的 DateInRegion
/Date
時間實(shí)例。
例子
// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
// 03 gen 2015, 15:10:00 CET
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let startOfHour = date.startOf(component: .hour) // 03 gen 2015, 15:00:00 CET
let startOfMonth = date.startOf(component: .month) // 01 gen 2015, 00:00:00 CET
let startOfWeek = date.startOf(component: .weekOfMonth) // 28 dic 2014, 00:00:00 CET
時間所對應(yīng)的單位結(jié)束值
概述
利用 .startOf()
方法,傳入單位后宾茂,你可以獲得現(xiàn)有時間對應(yīng)的結(jié)束址瓷马。
聲明
endOf(component: Calendar.Component) -> DateInRegion
endOf(component: Calendar.Component) -> Date
參數(shù)
-
component
: component to alter
返回結(jié)果
返回給定時間單位區(qū)間的結(jié)束址所對應(yīng)的 DateInRegion
/Date
時間實(shí)例。
// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
// 03 gen 2015, 15:10:00 CET
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let startOfHour = date.endOf(component: .hour) // 03 gen 2015, 15:59:59 CET
let startOfMonth = date.endOf(component: .month) // 31 gen 2015, 23:59:59 CET
let startOfWeek = date.endOf(component: .weekOfMonth) // 03 gen 2015, 23:59:59 CET
對時間的時刻進(jìn)行修改
概述
針對現(xiàn)有的時間實(shí)例刻炒, .atTime(hour:minute:second)
方法可以修改時刻决采,提供 時
、分
坟奥、 秒
的值,獲得一個新的時間拇厢,新的實(shí)例中日期與日期不變爱谁。
異常
如果原時間不能生成新時間,會拋出 .FailedToCalculate
異常孝偎。
聲明
func atTime(hour: Int, minute: Int, second: Int) throws -> DateInRegion
func atTime(hour: Int, minute: Int, second: Int) throws -> Date
參數(shù)
-
hour
: hour(s) to set -
minute
: minute(s) to set -
second
: second(s) to set
返回結(jié)果
在原時間基礎(chǔ)上访敌,依據(jù)你提供的時
、分
衣盾、秒
生成一個新時間實(shí)例寺旺,地區(qū)設(shè)置保持不變。此外势决,其他的時間組件在必要時 SwiftDate 會加以修改阻塑,以保持合理性。
例子
// 生成一個新的羅馬時間果复,日歷格式選擇公歷陈莽,時間表述格式以意大利為準(zhǔn)。
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// 應(yīng)用 `.atTime()` 方法
let newDateAtGivenTime = try! date.atTime(hour: 09, minute: 10, second: 22) // 03 gen 2015, 09:10:22 CET
對時間的指定組件進(jìn)行修改
概述
對指定的時間組件的值進(jìn)行修改虽抄,在保證其他組件值合理的情況下走搁,返回一個新的時間實(shí)例。
聲明
func at(unit: Calendar.Component, value: Int) throws -> DateInRegion
func at(unit: Calendar.Component, value: Int) throws -> Date
參數(shù)
-
unit
: calendar component unit to alter
異常
如果給定的組件賦值不成功迈窟,不能生成新時間實(shí)例時私植,會拋出 .FailedToCalculate
異常。
返回結(jié)果
在原時間基礎(chǔ)上车酣,修改給定組件的值曲稼,然后生成新的時間實(shí)例并返回。SwiftDate 在合理的前提下不會改變與給定組件相比單位更大組件的值骇径。補(bǔ)充說明:如果修改了時間中 日
的值躯肌,那所有的時
、分
破衔、秒
等更小的組件的值都會被賦最小值 清女,而 年
月
等更大單位的組件的值會保持原樣,這樣做是為了保持合理性晰筛,03-31嫡丙,如果對月改成 2 拴袭,那2-31 很明顯不合理。比如 2016-11-11 11:11:11 修改了 月
為 12
那曙博,返回的新的時間是 2016-12-01 00:00:00
例子
// 生成一個新的羅馬時間拥刻,日歷格式選擇公歷,時間表述格式以意大利為準(zhǔn)父泳。
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let atGivenYear = try! date.at(unit: .year, value: 2020) // 01 gen 2020, 00:00:00 CET. day is altered
批量修改時間組件的值
概述
給定一個 [時間組件 : 值]
的字典般哼,SwiftDate 會根據(jù)時間組件的單位由小到大排序,并修改對應(yīng)組件的值惠窄。
在 SwiftDate 中蒸眠,規(guī)定時間組件的由小到大排序?yàn)椋?br>
.nanosecond
,.second
,.minute
,.hour
,.day
,.month
,.year
,.yearForWeekOfYear
,.weekOfYear
,.weekday
,.quarter
,.weekdayOrdinal
,.weekOfMonth
.
聲明
func at(unitsWithValues dict: [Calendar.Component : Int]) throws -> DateInRegion
func at(unitsWithValues dict: [Calendar.Component : Int]) throws -> Date
參數(shù)
-
unitsWithValues
: calendar component units to alter
異常
對某些時間組件賦值發(fā)生錯誤時,會拋出 .FailedToCalculate
異常杆融。
返回結(jié)果
對指定組件賦值后楞卡,生成一個新的時間實(shí)例,比給定時間組件更大的組件將不會被修改脾歇,更小的如果沒有賦值將全部賦最小值蒋腮;這部分的原理,在上一個方法中有補(bǔ)充說明藕各。
例子
// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let time = try! date.at(unitsWithValues: [.year: 2016, .month: 7]) // 01 gen 2016, 00:00:00 CET
獲取多個時間中的最靠前(時間線上最靠右的)的時間
概述
在給定的多個時間實(shí)例集合中池摧,返回其中最新的時間實(shí)例。比較依據(jù)絕對時間值座韵,時間實(shí)例的地區(qū)险绘,時區(qū),表述格式等組件不會對比較結(jié)果產(chǎn)生影響誉碴。
聲明
(DateInRegion) static func latestDate(_ list: [DateInRegion]) -> DateInRegion
(Date) static func latestDate(_ list: [DateInRegion]) -> Date
例子
// date1 = 2015-01-03 15:10:00
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// date2 = 2014-12-30 20:10:00
let date2 = try! DateInRegion(components: [.year: 2014, .month: 12, .day: 30, .hour: 20, .minute: 10, .second: 0], fromRegion: regionRome)
// date3 = 2015-01-03 15:20:00
let date3 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 20, .second: 0], fromRegion: regionRome)
// get the latest date in a set
let latestDate = DateInRegion.latestDate([date1,date2,date3]) // is date1 (2015-01-03 14:20:00 +0000)
// or directly via Array extension
let latestDate = [date1,date2,date3].latestDate
獲取多個時間中最久遠(yuǎn)(時間線上最靠左的)的時間
概述
在給定的多個時間實(shí)例集合中宦棺,返回其中最久遠(yuǎn)的時間。比較依據(jù)絕對時間值黔帕,時間實(shí)例的地區(qū)代咸,時區(qū),表述格式等組件不會對比較結(jié)果產(chǎn)生影響成黄。
聲明
(DateInRegion) static func earliestDate(_ list: [DateInRegion]) -> DateInRegion
(Date) static func earliestDate(_ list: [DateInRegion]) -> Date
例子
// date1 = 2015-01-03 15:10:00
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// date2 = 2014-12-30 20:10:00
let date2 = try! DateInRegion(components: [.year: 2014, .month: 12, .day: 30, .hour: 20, .minute: 10, .second: 0], fromRegion: regionRome)
// date3 = 2015-01-03 15:20:00
let date3 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 20, .second: 0], fromRegion: regionRome)
// get the latest date in a set
let earliestDate = DateInRegion.earliestDate([date1,date2,date3]) // is date2 30 dic 2014, 20:10:00 CET
// or directly via Array extension
let earliestDate = [date1,date2,date3].earliestDate
給定單位呐芥,比較兩時間實(shí)例
概述
在給定單位的前提下,比較現(xiàn)有時間是否晚于提供的時間奋岁。
聲明
func compare(to date: DateInRegion, granularity: Calendar.Component) -> ComparisonResult
func compare(to date: Date, granularity: Calendar.Component) -> ComparisonResult
參數(shù)
-
date
: date to compare -
granularity
: 你所期望的比較粒度至少要比兩時間之間的最大不同組件之間要小思瘟,否則比較結(jié)果會顯示相等。
補(bǔ)充說明
在同一個月的兩個不同時間時間闻伶,以月
為單位比較時滨攻,是相等的,比如(偽代碼)
date1 = 2016-11-11 11:11:11
date2 = 2016-11-12 11:11:11
但日
或者更小的的單位比較,返回結(jié)果就是date2
更大
是否早于某時間(給定單位)
概述
在給定單位前提下光绕,比較現(xiàn)有時間是否早于給定時間女嘲。
聲明
func isBefore(date: DateInRegion, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
func isBefore(date: Date, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
參數(shù)
-
date
: date to compare -
orEqual
: true to also check for equality -
granularity
: The smallest unit that must, along with all larger units, be less for the given dates.
是否晚于某時間(給定單位)
概述
在給定單位粒度前提下,比較現(xiàn)有時間是否晚于給定時間诞帐。
聲明
func isAfter(date: DateInRegion, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
func compare(to date: Date, granularity: Calendar.Component) -> ComparisonResult
func isAfter(date: Date, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
參數(shù)
-
date
: date to compare -
orEqual
: true to also check for equality -
granularity
: The smallest unit that must, along with all larger units, be less for the given dates.
是否等于某時間
概述
比較現(xiàn)有時間實(shí)例是否完全等于給定時間欣尼。
聲明
func isEqual(to compareDate: DateInRegion) -> Bool
參數(shù)
-
compareDate
: a date to compare against
修改時間
SwiftDare 中文版說明文檔 - 修改時間 - 5
@(丁香園學(xué)習(xí)筆記)[swift, 翻譯]
概覽
使用 SwiftDate 來對時間進(jìn)行相關(guān)修改操作十分簡便;修改時間組件停蕉,比較兩個時間(時間的不同以他們之間的不等組件來表示)愕鼓。無論是帶有地區(qū)屬性的 DateInRegion
時間實(shí)例還是單一結(jié)構(gòu)的 Date
時間實(shí)例,都可以進(jìn)行這些操作慧起。
數(shù)學(xué)運(yùn)算
為時間添加組件
你可以使用 Swift 中常用數(shù)學(xué)運(yùn)算符拒啰,來增減時間元素的值。如+
完慧、-
根據(jù)你所表達(dá)的上下文,SwiftDate 會自動判斷并生成帶有地區(qū)屬性的 DateInRegion
時間實(shí)例或單一結(jié)構(gòu)的 Date
時間實(shí)例剩失。
可用的時間組件有: nanoseconds
,seconds
,minutes
,hours
,days
,weeks
,years
下面是一些數(shù)學(xué)運(yùn)算的例子:
// 創(chuàng)建一個羅馬時間 2015-01-03 @ 15:10:00
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
var date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// 讓我試試數(shù)學(xué)運(yùn)算符修改時間元素值
date = date + 3.seconds + 15.minutes // -> 03 gen 2015, 15:25:03 CET
date = date - 120.seconds // minus 2 minutes -> 03 gen 2015, 15:23:03 CET
date = date + 3.weeks // 24 gen 2015, 15:23:03 CET
// 你也可以直接增加絕對秒數(shù)屈尼,SwiftDate 會自動幫你換算
date.add(interval: 10) // 24 gen 2015, 15:23:03 CET
比較時間
概述
在 Swift3 的 Foundation 庫中,已經(jīng)支持比較 Date
時間實(shí)例拴孤。
SwiftDate 為帶有地區(qū)屬性的 DateInRegion
補(bǔ)充了相似的比較方法脾歧,并通過添加新方法擴(kuò)充了現(xiàn)有 Foundation 庫對不同粒度下的時間比較。
比較簡單時間
你可以使用 >
,>=
,<
,=<
運(yùn)算符來比較時間演熟,例如:
// 03 gen 2015, 15:10:00 CET
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let date2 = try! DateInRegion(components: [.year: 2015, .month: 2, .day: 5, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
if date2 > date1 { // DateInRegion supports Equatable protocol you can use >=, <=, < or >
print("'\(date2)' date is later than '\(date1)'")
}
if date2 == date1 {
// simple equality
}
時間所對應(yīng)的單位起始值
概述
利用 .startOf()
方法鞭执,傳入計算單位后,你可以獲得改時間到現(xiàn)在的差值芒粹。補(bǔ)充說明:時間是一個點(diǎn)值兄纺,而時間的單位都是一段時間的差值,這里的起始值指的就是時間點(diǎn)值在時間單位的區(qū)間中的左邊界值化漆;比如估脆,2016-11-11 20:39:50 ,以月為單位座云,起始值是 2016-11-01 00:00:00疙赠;以小時為單位 ,起始值是 2016-11-11 20:00:00朦拖。
聲明
startOf(component: Calendar.Component) -> DateInRegion
startOf(component: Calendar.Component) -> Date
參數(shù)
-
component
: component to alter
返回值
返回給定時間單位區(qū)間的起始值所對應(yīng)的 DateInRegion
/Date
時間實(shí)例圃阳。
例子
// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
// 03 gen 2015, 15:10:00 CET
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let startOfHour = date.startOf(component: .hour) // 03 gen 2015, 15:00:00 CET
let startOfMonth = date.startOf(component: .month) // 01 gen 2015, 00:00:00 CET
let startOfWeek = date.startOf(component: .weekOfMonth) // 28 dic 2014, 00:00:00 CET
時間所對應(yīng)的單位結(jié)束值
概述
利用 .startOf()
方法,傳入單位后璧帝,你可以獲得現(xiàn)有時間對應(yīng)的結(jié)束址捍岳。
聲明
endOf(component: Calendar.Component) -> DateInRegion
endOf(component: Calendar.Component) -> Date
參數(shù)
-
component
: component to alter
返回結(jié)果
返回給定時間單位區(qū)間的結(jié)束址所對應(yīng)的 DateInRegion
/Date
時間實(shí)例。
// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
// 03 gen 2015, 15:10:00 CET
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let startOfHour = date.endOf(component: .hour) // 03 gen 2015, 15:59:59 CET
let startOfMonth = date.endOf(component: .month) // 31 gen 2015, 23:59:59 CET
let startOfWeek = date.endOf(component: .weekOfMonth) // 03 gen 2015, 23:59:59 CET
對時間的時刻進(jìn)行修改
概述
針對現(xiàn)有的時間實(shí)例, .atTime(hour:minute:second)
方法可以修改時刻祟同,提供 時
作喘、分
、 秒
的值晕城,獲得一個新的時間泞坦,新的實(shí)例中日期與日期不變。
異常
如果原時間不能生成新時間砖顷,會拋出 .FailedToCalculate
異常贰锁。
聲明
func atTime(hour: Int, minute: Int, second: Int) throws -> DateInRegion
func atTime(hour: Int, minute: Int, second: Int) throws -> Date
參數(shù)
-
hour
: hour(s) to set -
minute
: minute(s) to set -
second
: second(s) to set
返回結(jié)果
在原時間基礎(chǔ)上,依據(jù)你提供的時
滤蝠、分
豌熄、秒
生成一個新時間實(shí)例,地區(qū)設(shè)置保持不變物咳。此外锣险,其他的時間組件在必要時 SwiftDate 會加以修改,以保持合理性览闰。
例子
// 生成一個新的羅馬時間芯肤,日歷格式選擇公歷,時間表述格式以意大利為準(zhǔn)压鉴。
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// 應(yīng)用 `.atTime()` 方法
let newDateAtGivenTime = try! date.atTime(hour: 09, minute: 10, second: 22) // 03 gen 2015, 09:10:22 CET
對時間的指定組件進(jìn)行修改
概述
對指定的時間組件的值進(jìn)行修改崖咨,在保證其他組件值合理的情況下,返回一個新的時間實(shí)例油吭。
聲明
func at(unit: Calendar.Component, value: Int) throws -> DateInRegion
func at(unit: Calendar.Component, value: Int) throws -> Date
參數(shù)
-
unit
: calendar component unit to alter
異常
如果給定的組件賦值不成功击蹲,不能生成新時間實(shí)例時,會拋出 .FailedToCalculate
異常婉宰。
返回結(jié)果
在原時間基礎(chǔ)上歌豺,修改給定組件的值,然后生成新的時間實(shí)例并返回芍阎。SwiftDate 在合理的前提下不會改變與給定組件相比單位更大組件的值世曾。補(bǔ)充說明:如果修改了時間中 日
的值,那所有的時
谴咸、分
轮听、秒
等更小的組件的值都會被賦最小值 ,而 年
月
等更大單位的組件的值會保持原樣岭佳,這樣做是為了保持合理性血巍,03-31,如果對月改成 2 珊随,那2-31 很明顯不合理述寡。比如 2016-11-11 11:11:11 修改了 月
為 12
那柿隙,返回的新的時間是 2016-12-01 00:00:00
例子
// 生成一個新的羅馬時間,日歷格式選擇公歷鲫凶,時間表述格式以意大利為準(zhǔn)禀崖。
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let atGivenYear = try! date.at(unit: .year, value: 2020) // 01 gen 2020, 00:00:00 CET. day is altered
批量修改時間組件的值
概述
給定一個 [時間組件 : 值]
的字典,SwiftDate 會根據(jù)時間組件的單位由小到大排序螟炫,并修改對應(yīng)組件的值波附。
在 SwiftDate 中,規(guī)定時間組件的由小到大排序?yàn)椋?br>
.nanosecond
,.second
,.minute
,.hour
,.day
,.month
,.year
,.yearForWeekOfYear
,.weekOfYear
,.weekday
,.quarter
,.weekdayOrdinal
,.weekOfMonth
.
聲明
func at(unitsWithValues dict: [Calendar.Component : Int]) throws -> DateInRegion
func at(unitsWithValues dict: [Calendar.Component : Int]) throws -> Date
參數(shù)
-
unitsWithValues
: calendar component units to alter
異常
對某些時間組件賦值發(fā)生錯誤時,會拋出 .FailedToCalculate
異常。
返回結(jié)果
對指定組件賦值后冷守,生成一個新的時間實(shí)例,比給定時間組件更大的組件將不會被修改仅财,更小的如果沒有賦值將全部賦最小值;這部分的原理碗淌,在上一個方法中有補(bǔ)充說明盏求。
例子
// Create a Region in Rome TimeZone with Gregorian Calendar and Italy locale settings
// 03 gen 2015, 15:10:00 CET
let regionRome = Region(tz: TimeZoneName.europeRome, cal: CalendarName.gregorian, loc: LocaleName.italianItaly)
let date = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
let time = try! date.at(unitsWithValues: [.year: 2016, .month: 7]) // 01 gen 2016, 00:00:00 CET
獲取多個時間中的最靠前(時間線上最靠右的)的時間
概述
在給定的多個時間實(shí)例集合中,返回其中最新的時間實(shí)例亿眠。比較依據(jù)絕對時間值风喇,時間實(shí)例的地區(qū),時區(qū)缕探,表述格式等組件不會對比較結(jié)果產(chǎn)生影響。
聲明
(DateInRegion) static func latestDate(_ list: [DateInRegion]) -> DateInRegion
(Date) static func latestDate(_ list: [DateInRegion]) -> Date
例子
// date1 = 2015-01-03 15:10:00
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// date2 = 2014-12-30 20:10:00
let date2 = try! DateInRegion(components: [.year: 2014, .month: 12, .day: 30, .hour: 20, .minute: 10, .second: 0], fromRegion: regionRome)
// date3 = 2015-01-03 15:20:00
let date3 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 20, .second: 0], fromRegion: regionRome)
// get the latest date in a set
let latestDate = DateInRegion.latestDate([date1,date2,date3]) // is date1 (2015-01-03 14:20:00 +0000)
// or directly via Array extension
let latestDate = [date1,date2,date3].latestDate
獲取多個時間中最久遠(yuǎn)(時間線上最靠左的)的時間
概述
在給定的多個時間實(shí)例集合中还蹲,返回其中最久遠(yuǎn)的時間爹耗。比較依據(jù)絕對時間值,時間實(shí)例的地區(qū)谜喊,時區(qū)潭兽,表述格式等組件不會對比較結(jié)果產(chǎn)生影響。
聲明
(DateInRegion) static func earliestDate(_ list: [DateInRegion]) -> DateInRegion
(Date) static func earliestDate(_ list: [DateInRegion]) -> Date
例子
// date1 = 2015-01-03 15:10:00
let date1 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 10, .second: 0], fromRegion: regionRome)
// date2 = 2014-12-30 20:10:00
let date2 = try! DateInRegion(components: [.year: 2014, .month: 12, .day: 30, .hour: 20, .minute: 10, .second: 0], fromRegion: regionRome)
// date3 = 2015-01-03 15:20:00
let date3 = try! DateInRegion(components: [.year: 2015, .month: 1, .day: 3, .hour: 15, .minute: 20, .second: 0], fromRegion: regionRome)
// get the latest date in a set
let earliestDate = DateInRegion.earliestDate([date1,date2,date3]) // is date2 30 dic 2014, 20:10:00 CET
// or directly via Array extension
let earliestDate = [date1,date2,date3].earliestDate
給定單位斗遏,比較兩時間實(shí)例
概述
在給定單位的前提下山卦,比較現(xiàn)有時間是否晚于提供的時間。
聲明
func compare(to date: DateInRegion, granularity: Calendar.Component) -> ComparisonResult
func compare(to date: Date, granularity: Calendar.Component) -> ComparisonResult
參數(shù)
-
date
: date to compare -
granularity
: 你所期望的比較粒度至少要比兩時間之間的最大不同組件之間要小诵次,否則比較結(jié)果會顯示相等账蓉。
補(bǔ)充說明
在同一個月的兩個不同時間時間,以月
為單位比較時逾一,是相等的铸本,比如(偽代碼)
date1 = 2016-11-11 11:11:11
date2 = 2016-11-12 11:11:11
但日
或者更小的的單位比較,返回結(jié)果就是date2
更大
是否早于某時間(給定單位)
概述
在給定單位前提下遵堵,比較現(xiàn)有時間是否早于給定時間箱玷。
聲明
func isBefore(date: DateInRegion, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
func isBefore(date: Date, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
參數(shù)
-
date
: date to compare -
orEqual
: true to also check for equality -
granularity
: The smallest unit that must, along with all larger units, be less for the given dates.
是否晚于某時間(給定單位)
概述
在給定單位粒度前提下怨规,比較現(xiàn)有時間是否晚于給定時間。
聲明
func isAfter(date: DateInRegion, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
func compare(to date: Date, granularity: Calendar.Component) -> ComparisonResult
func isAfter(date: Date, orEqual: Bool = false, granularity: Calendar.Component) -> Bool
參數(shù)
-
date
: date to compare -
orEqual
: true to also check for equality -
granularity
: The smallest unit that must, along with all larger units, be less for the given dates.
是否等于某時間
概述
比較現(xiàn)有時間實(shí)例是否完全等于給定時間锡足。
聲明
func isEqual(to compareDate: DateInRegion) -> Bool
參數(shù)
-
compareDate
: a date to compare against
時間的格式化
概覽
SwiftDate 提供多個簡便的方法來輸出或解析時間和時間間隔字符串波丰,以下為常見時間格式舉例:
使用 tr35-31
格式的時間格式字符串,例如 yyyy-MM-dd
對應(yīng) 2015-01-05
任意符合 ISO8601
及其子規(guī)范的時間格式字符串
符合 .NET
的時間格式字符串
擴(kuò)展化日期/時間格式舶得,詳情請參照 EDTF
聲明單位的時間差掰烟,如 (date2 - date1).in(.hours)
人類可讀或口語化的字符串,如 "1 hour ago", "1m", "now"
兩個時間之間的差值扩灯,比如 "2h,5m,3s"
獲取自定義格式的時間字符串
你可以使用 .string()
方法傳入自定義格式媚赖,獲得時間實(shí)例生成對應(yīng)的字符串。字符串的 Unicode 規(guī)范與 Cocoa 用法一致珠插。
聲明 DateFormat
包含了 .custom
自定義格式惧磺,你可以使用通用的// with DateFormat set to .custom([format string])
func string(format: DateFormat) -> String
也可以直接使用接受自定義格式的方法// shortcut to pass directly the format of the string
func string(custom: String) -> String
參數(shù)
format
: a DateFormat
struct. To use custom strings pass .custom()
and pass the value of the formatter
例子
let date = DateInRegion()
let str = date.string(format: .custom("yyyy-MM-dd HH:mm:ss")) // example output: 2016-09-28 13:48:17
// you can also use the shortcut:
let str = date.string(custom: "yyyy-MM-dd HH:mm:ss") // same result
獲取 ISO8601 格式的時間字符串
SwiftDate 支持 ISO8601
時間規(guī)范的所有要求。你可以基于其子規(guī)范而自定義格式捻撑。
聲明// with DateFormat set to .custom() func string(format: DateFormat) -> String
參數(shù)
format
: a DateFormat
struct. To use custom strings pass .custom() and pass the value of the formatter
例子
let date = DateInRegion()
// Here some combinations of ISO8601DateTimeFormatter.Options you can set to format (or parse) an ISO8601 datetime
let iso8601_ex_1 = date.string(format: .iso8601(options: [.withInternetDateTime])) // 2016-09-29T10:47:39+02:00
let iso8601_ex_2 = date.string(format: .iso8601(options: [.withFullDate])) // 2016-09-29
let iso8601_ex_3 = date.string(format: .iso8601(options: [.withWeekOfYear,.withYear])) // 2016W40
let iso8601_ex_4 = date.string(format: .iso8601(options: [.withFullTime,.withFullDate,.withSpaceBetweenDateAndTime])) // 2016-09-29 10:49:42+02:00
let iso8601_ex_5 = date.string(format: .iso8601(options: [.withMonth,.withYear,.withTime])) // 20160910:50:36
獲取 AltRss 格式的時間字符串
SwiftDate 也提供對 RSS
和AltRSS
時間格式的支持磨隘。(包括解析與生成字符串)
聲明func string(format: DateFormat) -> String // with DateFormat set to .rss(alt: Bool)
參數(shù)
format
: a DateFormat
struct. To get RSS/AltRSS
pass.rss(alt: Bool)
and pass true
or false
to set the alt format.
例子
let date = DateInRegion()
let altrss_string = date.string(format: .rss(alt: true)) // Alt RSS Format: 29 Sep 2016 10:55:34 +0200
let rss_string = date.string(format: .rss(alt: false)) // RSS Format: Thu, 29 Sep 2016 10:55:34 +0200
獲取 .NET 格式的時間字符串
SwiftDate 也提供對 .NET
時間格式的支持。(包括解析與生成字符串)
聲明func string(format: DateFormat) -> String // with DateFormat set to .dotNET
參數(shù)
format
: a DateFormat
struct. To get .NET
pass.dotNET
and pass true
or false
to set the alt format.
例子
let date = DateInRegion()
let donet_string = date.string(format: .dotNET) // /Date(1475139751633+0200)/
獲取擴(kuò)展化(EDTF)格式的時間字符串
SwiftDate 也提供對擴(kuò)展化日期/時間格式的支持顾患。
聲明func string(format: DateFormat) -> String // with DateFormat set to .extended
參數(shù)
format
: a DateFormat
struct. To get extended datetime formatted string pass .extended
and pass true
or false
to set the alt format.
例子
let date = DateInRegion()
let str = date.string(format: .extended) // Thu 29-Sep-2016 AD 11:31:23.886 GMT+2
獲取時間間隔的字符串表述
借助 SwiftDate 番捂,你可以很方便的將時間間隔或兩個時間之間的差值,以一個或多個單位輸出成字符串江解。如果你想要獲取的低級單位的值可以被完整進(jìn)位设预,那低級單位所對應(yīng)的值就被賦值為 0。比如 120秒 如果轉(zhuǎn)換成 分
犁河、秒
的組合鳖枕,會被轉(zhuǎn)換成 2分 0秒
; 125秒 則會得到 2分 5秒
聲明多個時間單位時public func in
(_ components: [Calendar.Component], of calendar: CalendarName? = nil) -> [Calendar.Component : Int]
單個時間單位時public func in
(_ component: Calendar.Component, of calendar: CalendarName? = nil) -> Int?
參數(shù)
component
or components
: specify the component or an array of compone .extended
and pass true
or false
to set the alt format.
例子
let dateA = DateInRegion()
let dateB = dateA + 20.minutes + 120.seconds // create another date with some diff
// Get difference in minutes
let diff_in_minutes = (dateB - dateA).in(.minute) // 22 minutes
// Get difference in seconds and minutes
let diff_in_min_and_secs = (dateB - dateA).in([.minute,.second]) // lower components are grouped. You will get .second=0, .minute=2
// This is another example
let another_diff: TimeInterval = 125 // 125 seconds
let diff_in_min_and_secs_2 = another_diff.in([.minute,.second]) // you will get .minute=2 and .second=5
獲取 iOS 樣式的時間字符串
你可以使用 Foundation
中的時間格式來輸出時間字符串桨螺。
聲明func string(dateStyle: DateFormatter.Style = .medium, timeStyle: DateFormatter.Style = .medium) -> String
參數(shù)
dateStyle
: the style used to print a date as DateFormatter.Style
. If not specified.medium
is used.
timeStyle
: the style used to print a time as DateFormatter.Style
. If not specified .medium
is used.
例子
let date = DateInRegion() // create a date from current time in local device's region and calendar
// Some examples of date as string formatted with different styles for date and time
let example_1 = date.string(dateStyle: .medium, timeStyle: .long) // Sep 29, 2015, 1:01:13 PM GMT+2
let example_2 = date.string(dateStyle: .short, timeStyle: .short) // 9/29/15, 1:00 PM
let example_3 = date.string(dateStyle: .long, timeStyle: .none) // September 29, 2015
獲取人類可讀或白話式時間字符串
你可以使用 Foundation
來自定義日期 - 時間格式來輸出時間字符串宾符;同樣的,時間間隔也可以使用口語化字符串來表述灭翔。
聲明獲取一個時間與現(xiàn)在時刻的差值時func colloquialSinceNow() throws -> (date: String, time: String?)
獲取兩個時間之間的差值時func colloquial(toDate date: DateInRegion) throws -> (date: String, time: String?)
注意:該方法返回的是一個日期與時間的元組魏烫。
異常如果兩個時間采用不同的日歷,會拋出 .DifferentCalendar
異常肝箱;如果無法計算出兩個時間的間隔哄褒,會拋出 .FailedToCalculate
異常。
參數(shù)
date
: reference date for comparisor
例子
// Returned tuples (in EN):
// "past month" for interval, "Aug, 29 2016" for relevant time
let dateA = DateInRegion() - 1.months
let (colloquial,relevantTime) = try! dateA.colloquialSinceNow()
// Returned tuples (in EN):
// "2 hours ago" for interval, "at 11:28" for relevant time
let dateB = DateInRegion() - 2.hours - 14.minutes
let (colloquial,relevantTime) = try! dateB.colloquialSinceNow()
?
// Returned tuples (in EN):
// // "14 minutes ago" for interval, nil for relevant time
let dateC = DateInRegion() - 14.minutes
let (colloquial,relevantTime) = try! dateC.colloquialSinceNow()
// Returned tuples (in EN):
// "2012" for interval, "Sep 2012" for relevant time
let dateD = DateInRegion() - 4.years
let (colloquial,relevantTime) = try! dateD.colloquialSinceNow()
指定單位下煌张,獲取兩個時間之間的間隔字符串
SwiftDate 可以在指定組件單位的前提下读处,獲取兩個時間的差值,并輸出為字符串唱矛;你可以設(shè)置任意一個組件的顯示位置罚舱,比如(年使用 y
或years
來表述)井辜;組件所對應(yīng)的最大值以及最小值都會被妥善處理,比如日月年這些單位最小值是 1管闷,最大值是 12粥脚,而時分秒的最大值是 60 ,最小值是 0包个。
聲明 獲取一個時間與現(xiàn)在時刻的差值時func timeComponentsSinceNow(options:,shared:) throws -> String
獲取兩個時間之間的差值時func timeComponents(to:options:shared:) throws -> String
異常如果不能計算出有效的時間間隔刷允,將會拋出 .FailedToCalculate
錯誤。
參數(shù)
to
: reference date for comparisor
options
: struct ComponentsFormatterOptions which defines a list of options used to print time components
例子
let region = Region.GMT()
let dateB = DateInRegion(absoluteDate: Date(), in: region)
let dateC = dateB - 2.years - 4.months - 5.days
?
let str2 = try! dateC.timeComponents(toDate: dateB, options: ComponentsFormatterOptions(style: .positional)) // -2y 4m 0w 5d 0:00:00
let str3 = try! dateC.timeComponents(toDate: dateB, options: ComponentsFormatterOptions(style: .full)) // -2 years, 4 months, 0 weeks, 5 days, 0 hours, 0 minutes, 0 seconds
let str4 = try! dateC.timeComponents(toDate: dateB, options: ComponentsFormatterOptions(zero: .dropAll)) // -2y 4m 5d
let dateD = dateB + 1.months
let str5 = try! dateD.timeComponentsSinceNow(options: ComponentsFormatterOptions(allowedUnits: [.weekOfMonth,.day], zero: .dropAll)) // 4w 2d