NSDate的基本用法

1.NSDate對(duì)象轉(zhuǎn)成格式化的字符串對(duì)象

//通過(guò) NSDate 獲取當(dāng)前日期
let currentDate = NSDate()

// NSDateFormatter 轉(zhuǎn)換日期和字符串的工具
let dateFormatter = NSDateFormatter()

1.1 設(shè)置區(qū)域

dateFormatter.locale = NSLocale.currentLocale()
如果要設(shè)置日期為其他區(qū)域
//比如設(shè)置成希臘
dateFormatter.locale = NSLocale(localeIdentifier:"el_GR")

1.2 設(shè)置日期格式
有兩種方式可以設(shè)置日期格式:一種是通過(guò)一些預(yù)定義的日期格式化樣式(style)衅谷;另外一種是通過(guò)某些說(shuō)明符來(lái)手動(dòng)設(shè)置日期格式。

首先我們先使用 NSDateFormatterStyle 設(shè)置日期格式在旱。

//完整樣式
dateFormatter.dateStyle = NSDateFormatterStyle.FullStyle
var convertedDate = dateFormatter.stringFromDate(currentDate)
Tuesday, October 12, 2017

//長(zhǎng)樣式
dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
convertedDate = dateFormatter.stringFromDate(currentDate)
October 12, 2017

//中長(zhǎng)樣式
dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
convertedDate = dateFormatter.stringFromDate(currentDate)
Otc 12,2017

//短樣式
dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
convertedDate = dateFormatter.stringFromDate(currentDate)
10/9/17

使用日期說(shuō)明符來(lái)設(shè)置日期格式

EEEE:“星期”的全名(比如Monday)。如需縮寫(xiě),指定1-3個(gè)字符(如E,EE拆魏,EEE代表Mon)。
MMMM:“月份”的全名(比如October)慈俯。如需縮寫(xiě)渤刃,指定1-3個(gè)字符(如M,MM贴膘,MMM代表Oct)卖子。
dd:某月的第幾天(例如,09或15)
yyyy:四位字符串表示“年”(例如2015)
HH:兩位字符串表示“小時(shí)”(例如08或19)
mm:兩位字符串表示“分鐘”(例如05或54)
ss:兩位字符串表示“秒”
zzz:三位字符串表示“時(shí)區(qū)”(例如GMT)步鉴【疚福縮寫(xiě) Z
GGG:公元前BC或公元后AD
dateFormatter.dateFormat = "EEEE, MMMM dd, yyyy"
convertedDate = dateFormatter.stringFromDate(currentDate)

dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
convertedDate = dateFormatter.stringFromDate(currentDate)

2.將格式化的字符串通過(guò)date formatter轉(zhuǎn)換成 NSDate 對(duì)象

//示例1
var dateAsString = "24-08-2016 10:49"
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
var newDate = dateFormatter.dateFromString(dateAsString)
//示例2
dateAsString = "Thu, 08 Oct 2015 09:22:33 GMT"
dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss zzz"
newDate = dateFormatter.dateFromString(dateAsString)

使用 NSDateComponents 還可以單獨(dú)獲取某一項(xiàng)的值,例如氛琢,星期喊递、月份、時(shí)間阳似、小時(shí)等骚勘。
想要實(shí)現(xiàn)此功能呢,需要用到 NSCalendar 類(lèi) ,NSDateComponents 類(lèi)經(jīng)常和 NSCalendar 類(lèi)搭配使用俏讹,NSCalendar 真正執(zhí)行 NSDate 和 NSDateComponents 間的轉(zhuǎn)換当宴。這樣,我們先要獲取當(dāng)前的calendar泽疆。

let calendar = NSCalendar.currentCalendar()

首先我們先來(lái)看一個(gè) NSDate 到 NSDateComponents轉(zhuǎn)換的具體例子

let dateComponents = calendar.components([NSCalendarUnit.Day, NSCalendarUnit.Month,NSCalendarUnit.Year,NSCalendarUnit.WeekOfYear,NSCalendarUnit.Hour,NSCalendarUnit.Minute,NSCalendarUnit.Second,NSCalendarUnit.Nanosecond], fromDate: currentDate)
print("day = \(dateComponents.day)", "month = \(dateComponents.month)", "year = \(dateComponents.year)",  "week of year = \(dateComponents.weekOfYear)", "hour = \(dateComponents.hour)",  "minute = \(dateComponents.minute)", "second = \(dateComponents.second)","nanosecond = \(dateComponents.nanosecond)" , separator: ", ", terminator: "")

date components轉(zhuǎn)換到date對(duì)象

let components = NSDateComponents()
components.day = 5
components.month = 01
components.year = 2016
components.hour = 19
components.minute = 30
newDate = calendar.dateFromComponents(components)

3.比較日期和時(shí)間

首先先創(chuàng)建兩個(gè)自定義的日期對(duì)象

dateFormatter.dateFormat = "MMMM dd, yyyy zzz"
dateAsString = "Oct 08, 2015 GMT"
var date1 = dateFormatter.dateFromString(dateAsString)!

dateAsString = "Oct 10. 2015 GMT"
var date2 = dateFormatter.dateFromString(dateAsString)!

第一種方法
earlierDate: 判斷一個(gè)日期是否早于另外一個(gè)日期
laterDate: 判斷一個(gè)日期是否晚于另外一個(gè)日期
isEqualToDate:判斷兩個(gè)日期是否相等

print("Earlier date is:\(date1.earlierDate(date2))")
print("Later date is:\(date1.laterDate(date2))")
print("dates is Same:\(date1.isEqualToDate(date2))")

第二種方法
NSDate 的 compare: 方法户矢,它需要搭配使用 NSComparisonResult 枚舉體


if date1.compare(date2) == NSComparisonResult.OrderedDescending {

    print("Date1 is Later than Date2")
} else if date1.compare(date2) == NSComparisonResult.OrderedAscending {

    print("Date1 is Earlier than Date2")
} else if date1.compare(date2) == NSComparisonResult.OrderedSame {

    print("Same dates")
}

第三種方法
計(jì)算每個(gè)日期到現(xiàn)在的時(shí)間間隔來(lái)判斷

if date1.timeIntervalSinceReferenceDate > date2.timeIntervalSinceReferenceDate {
    
    print("Date1 is Later than Date2")

} else if date1.timeIntervalSinceReferenceDate < date2.timeIntervalSinceReferenceDate {
    
    print("Date1 is Earlier than Date2")

} else {

    print("Same dates")

}

4.計(jì)算時(shí)間間隔

首先自定義兩個(gè)NSDate對(duì)象

dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateAsString = "2015-10-08 14:25:37"
date1 = dateFormatter.dateFromString(dateAsString)!

dateAsString = "2018-03-05 08:14:19"
date2 = dateFormatter.dateFromString(dateAsString)!

第一種方法
使用 components:fromDate:toDate:options: ,第一個(gè)參數(shù)是 NSCalendarUnit 值的數(shù)組。這里要注意殉疼,如果第一個(gè)日期如果晚于第二個(gè)日期梯浪,則結(jié)果會(huì)返回負(fù)值。

var diffDateComponents = NSCalendar.currentCalendar().components([NSCalendarUnit.Year,NSCalendarUnit.Month,NSCalendarUnit.Day,NSCalendarUnit.Hour,NSCalendarUnit.Minute,NSCalendarUnit.Second], fromDate: date1, toDate: date2, options: NSCalendarOptions.init(rawValue: 0))
print("The difference between dates is: \(diffDateComponents.year) years, \(diffDateComponents.month) months, \(diffDateComponents.day) days, \(diffDateComponents.hour) hours, \(diffDateComponents.minute) minutes, \(diffDateComponents.second) seconds")

剩下的兩種方法都用到了 NSDateComponentsFormatter 類(lèi)瓢娜,它提供了多種用于自動(dòng)計(jì)算日期間隔的方法挂洛,并可以返回格式化字符串結(jié)果。首先眠砾,我們創(chuàng)建一個(gè)date components formatter對(duì)象虏劲,這里只指定一個(gè)屬性:

let dateComponentsFormatter = NSDateComponentsFormatter()
dateComponentsFormatter.unitsStyle = NSDateComponentsFormatterUnitsStyle.Full

unitsStyle 屬性指定我們使用的 dateComponentsFormatter 以何種格式打印日期的間隔。例如褒颈,這里我們使用 完整 樣式柒巫,這樣天數(shù)、月數(shù)等名字(如days谷丸,months)都會(huì)被顯示出來(lái)吻育。如果我們?cè)O(shè)置 縮寫(xiě) 樣式,就會(huì)顯示縮寫(xiě)名字(天數(shù)顯示為d等)淤井。你可以在 這個(gè)鏈接 中查找到所有的樣式:讓我們繼續(xù)會(huì)到日期間隔計(jì)算的話題上。我們先計(jì)算日期的間隔摊趾,再把該值傳遞給stringFromTimeInterval:方法币狠,這樣,就能獲得日期間隔的字符串表示:

let interval = date2.timeIntervalSinceDate(date1)
dateComponentsFormatter.stringFromTimeInterval(interval)

最后砾层,第三種計(jì)算的方法中漩绵,我們將兩個(gè)日期傳遞給 NSDateComponentsFormatter 對(duì)象的一個(gè)叫 stringFromDate:toDate: 的方法。但是這個(gè)方法需要有個(gè)前置的條件:NSDateComponentsFormatter 的 allowedUnits 屬性必須被提前設(shè)置肛炮,這個(gè)屬性接受數(shù)組類(lèi)型的值止吐,這里至少要設(shè)置一個(gè)日歷單元的值。否則這個(gè)方法會(huì)返回nil值侨糟。所以碍扔,在這個(gè)方法的使用中,我們“告訴”它需要獲取哪些日歷單元秕重,它會(huì)按照對(duì)應(yīng)的日歷單元返回結(jié)果:

dateComponentsFormatter.allowedUnits = [NSCalendarUnit.Year,NSCalendarUnit.Month,NSCalendarUnit.Day,NSCalendarUnit.Hour,NSCalendarUnit.Minute,NSCalendarUnit.Second]
let autoFormattedDifference = dateComponentsFormatter.stringFromDate(date1, toDate: date2)

感謝原作者的文章:這是一篇寫(xiě)給新手的NSDate教程(Swift版)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末不同,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌二拐,老刑警劉巖服鹅,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異百新,居然都是意外死亡企软,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)饭望,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仗哨,“玉大人,你說(shuō)我怎么就攤上這事杰妓≡逯危” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵巷挥,是天一觀的道長(zhǎng)桩卵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)倍宾,這世上最難降的妖魔是什么雏节? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮高职,結(jié)果婚禮上钩乍,老公的妹妹穿的比我還像新娘。我一直安慰自己怔锌,他們只是感情好寥粹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著埃元,像睡著了一般涝涤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岛杀,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天阔拳,我揣著相機(jī)與錄音,去河邊找鬼类嗤。 笑死糊肠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遗锣。 我是一名探鬼主播货裹,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼黄伊!你這毒婦竟也來(lái)了泪酱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墓阀,沒(méi)想到半個(gè)月后毡惜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斯撮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年经伙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勿锅。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帕膜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溢十,到底是詐尸還是另有隱情垮刹,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布张弛,位于F島的核電站荒典,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吞鸭。R本人自食惡果不足惜寺董,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刻剥。 院中可真熱鬧遮咖,春花似錦、人聲如沸造虏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)漓藕。三九已至魄藕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撵术,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工话瞧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫩与,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓交排,卻偏偏與公主長(zhǎng)得像划滋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子埃篓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容