iOS之NSDate

基礎知識

在我們開始詳細學習日期處理之前,需要先搞懂一些基礎概念。那就從最簡單的 NSDate 對象開始吧,在日期編程中,這個對象描述了 日期 和 時間 信息。所以它不但用於日期,也用於時間處理。格式化 這個概念在直接處理NSDate 對象時還用不到。可以把日期和時間看做是類中普通的屬性。只有在將日期對象轉換爲字符串對象時,才能用到格式化,接下來我們會看到許多格式化的實例。簡單說來,不論你需要的是日期、時間,或者兩者都需要,NSDate 類都可以勝任。

另外一個稍後需要關注的類是 NSDateComponents 。這個類可以簡單的看做是 NSDate 的“姐妹”類,因爲它爲開發者帶來了許多關於日期的便捷操作。其中一項重要內容是:它可以將日期和時間分割成獨立的屬性,這樣就可以直接訪問每項屬性,這在諸如日期計算之類的任務中非常有用。例如:NSDateComponents 實例中的“天”和“月”就可以按照如下方式展現:

1
2
3
let dateComponents = NSDateComponents()
let day = dateComponents.day
let month = dateComponents.month

這很簡單。另外,訪問日期組件(年,月,日等)並生成日期屬性到 NSDateComponents 中去需要先執行一些轉換命令,我們接下來會談這個。除了上面這些功能外, NSDateComponents 類在計算過去或未來的時間上也很有用。只需要簡單的對某個子屬性(年,月年等)執行加減操作,就可以算出未來或過去的一個時間。另外,NSDateComponents 類還適合查找兩個日期之間的間隔。後面我們會詳細的說明。

我們暫時不會詳細學習 NSDateComponents 類,這裏我們只需要學一下如何將 NSDate 和 NSDateComponents對象互相轉換,要提到的另外一個重要角色是 NSCalendar 類。這個類的功能並不在本文的討論範圍,但是,NSDate 和 NSDateComponents 之間的互相轉換,卻是有 NSCalendar 類來控制的(因爲需要制定某個NSCalendar 對象,才能完成轉換)。事實上,系統在進行轉換時,需要知道使用的日曆(曆法)是哪個,然後才能獲得正確的轉換結果(要知道,世界上有許多不同的日曆,其年月日的值是各不相同的)。你可以通過介紹中的文檔鏈接查看關於calendar的詳情,在這裏,你只需要知道我們會用 NSCalendar 的 currentCalendar() 方法獲取系統當前的calendar即可。

除了上述工具外,還有一個重要的 NSDateFormatter 類需要了解。這個類會幫助我們將 NSDate 對象轉換爲字符串對象,也可以將字符串對象轉換爲 NSDate 對象。通過它,可以將 NSDate 對象按照預定義的日期樣式直接轉換成字符串,也可以按自定義的日期格式進行轉換。我們稍後會看到幾個這樣的實例,也會看到互相轉換的例子。NSDateFormatter 對象也支持本地化功能,只需要提供一個有效的 NSLocale 對象,就可以按照給定的locale設置轉換成合適的字符串內容。

另外一個類似的類是 NSDateComponentsFormatter ,它有一個重要目的:輸入日期和時間,輸出格式化好的可讀字符串。它包含了許多方法來完成這個任務,在本教程最後部分你將看到幾個這樣的例子。但是在本教程中,除了例子中涉及的內容外,我們不會過多的講解這個類。

接下來,我們將直接學習之前提到的工作時如何完成的。再次建議你新建一個 playground 文件,最好的學習方法就是自己親身實踐。

NSDate和字符串相互轉換

一開始,我們需要通過 NSDate 類獲取當前日期,並且將其賦值給一個常量。和其他語言不同,獲取當前時間並不需要如 now() 或者 today() 之類特別的方法,只需要初始化一個 NSDate 對象即可。

1
let currentDate = NSDate()

在Xcode playground中寫入代碼後,結果如下:

t44_1_current_date.png

注意:這個值我們在後面會多次用到。現在來初始化一個 NSDateFormatter 對象,它是我們用來轉換日期和字符串的工具。

1
let dateFormatter = NSDateFormatter()

dateFormatter 對象默認會使用系統中設置的區域信息,除非顯式地設置區域。即便如此,手動設置區域也不是必須的。以下是設置區域的代碼:

1
dateFormatter.locale = NSLocale.currentLocale()

設置其他區域也很簡單,只需要通過 區域代碼 匹配到對應的區域即可。

1
2
dateFormatter.locale = NSLocale(localeIdentifier: "el_GR")
dateFormatter.locale = NSLocale(localeIdentifier: "fr_FR")

這兩行代碼展示瞭如何設置不同的區域,這裏用的是希臘和法國。當然,這樣依次設置多個區域是沒有意義的,因爲只有最後一次設置會生效。想知道區域信息對日期轉換字符串有什麼影響嗎?馬上你就會看到。

使用date formatter style格式化輸出字符串

在將 NSDate 轉換成字符串之前,你需要先“告訴”date formatter你想要什麼樣式的字符串。有兩種方式可以設置格式:一種是通過一些預定義的日期格式化樣式(style);另外一種是通過某些說明符來手動設置日期格式。
我們先開始使用第一種方式,這裏你會用到 NSDateFormatterStyle 的枚舉類型,它有若干個枚舉值,每個值都代表不同的樣式。我們來逐個查看。第一個樣式叫完整樣式(FullStyle),它的結果顯示如下:
t44_2_convert_fullstyle.png
下面是代碼,可以自己拷貝粘貼試試效果:

1
2
dateFormatter.dateStyle = NSDateFormatterStyle.FullStyle
var convertedDate = dateFormatter.stringFromDate(currentDate)

除了日期樣式的代碼外,stringFromDate 方法的使用也很重要,它是真正執行轉換的代碼。當談到日期、字符串轉換時,就指的是這個方法,而其他步驟只是起到定製結果的輔助作用。如果你在項目裏要用到日期轉換,這個方法會非常方便。
接下來,我們來看一下長樣式(Long Style)
03.png
代碼:

1
dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle

和完整樣式比,長樣式少了“天”的信息。
下來是 中等樣式(Medium Style)
04.png

1
2
dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
convertedDate = dateFormatter.stringFromDate(currentDate)

最後是 短樣式(Short Style)

1
2
dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle
convertedDate = dateFormatter.stringFromDate(currentDate)

現在你就知道了有哪些可用的日期樣式,在項目中可以根據需要在日期中使用。每個樣式都會產生不同的結果,說不定哪個會適合你。
之前我提到過如何改變默認的區域設置,既然我們已經學習了改變formatter,影響日期轉換結果的方式,接下來我們試着改變一下區域設置,看看會產生什麼樣的效果。在這個例子中,我會用完整樣式來轉換日期字符串,設置區域爲希臘和法國。
05.png

我想這個截圖很好的說明了區域的作用,你可以按照自己的需要設置。

使用日期格式說明符

預定義的日期樣式在大多數情況下都可以適用,然而我們不能改變這些樣式。若我們需要使用不同的格式,有一個方法:設置 自定義的日期格式 。設置自定義日期格式在兩種場景中很有用:
1.當預定義的日期樣式不能滿足我們的需求;
2.當我們需要把一個複雜的日期字符串(比如Thu, 08 Oct 2015 09:22:33 GMT)轉換成日期對象。
要想設置合適的日期格式(對象),必須搭配使用一系列說明符。說明符也是簡單的字符,但是對於date formatter來說有特定的含義。在查看具體的例子前,我們先列出一些在例子中出現的說明符:

  • EEEE:“星期”的全名(比如Monday)。如需縮寫,指定1-3個字符(如E,EE,EEE代表Mon)。

  • MMMM:“月份”的全名(比如October)。如需縮寫,指定1-3個字符(如M,MM,MMM代表Oct)。

  • dd:某月的第幾天(例如,09或15)

  • yyyy:四位字符串表示“年”(例如2015)

  • HH:兩位字符串表示“小時”(例如08或19)

  • mm:兩位字符串表示“分鐘”(例如05或54)

  • ss:兩位字符串表示“秒”

  • zzz:三位字符串表示“時區”(例如GMT)

  • GGG:公元前BC或公元后AD

要查看完整的說明符文檔,推薦訪問http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns這個鏈接。
我們繼續來看看這些說明符是如何發揮作用的。這次,讓我們把當前時間轉換成包含完整的星期、月份名稱、日期和年份信息。
06.png

1
2
dateFormatter.dateFormat = "EEEE, MMMM dd, yyyy"
convertedDate = dateFormatter.stringFromDate(currentDate)

沒有必要解釋代碼了,這個用法很直截了當。讓我們再轉換一個時間字符串:
07.png

1
2
dateFormatter.dateFormat = "HH:mm:ss"
convertedDate = dateFormatter.stringFromDate(currentDate)

到此,我們學到的轉換都是把*NSDate*對象轉成格式化的字符串對象。這個的逆過程也挺有意思,就是將格式化的字符串通過date formatter轉換成 NSDate 對象,這裏同樣也會用到之前的日期樣式和格式說明符。關鍵是要通過設置好的date formatter 對象調用 dateFromString ,讓我們來看個例子:
09.png

1
2
3
var dateAsString = "24-12-2015 23:59"
dateFormatter.dateFormat = "dd-MM-yyyy HH:mm"
var newDate = dateFormatter.dateFromString(dateAsString)

讓我們看個包含時區信息的複雜字符串:
10.png

1
2
3
dateAsString = "Thu, 08 Oct 2015 09:22:33 GMT"
dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss zzz"
newDate = dateFormatter.dateFromString(dateAsString)

現在可以看到時間值(09:22)變成了12:22,這時因爲時區生效了,實際上,時間並沒有發生變換,這個時間(12:22)是GMT時間(09:22)加上我當前時區(EET:GMT+3)的時差後的結果。稍後我們會再看幾個時區的例子,不過現在你可以在自己的機器上試一下效果。

到此,你已經掌握了日期、字符串間相互轉換的知識。你可以自己嘗試寫寫代碼,來理解日期編程的原理。

使用NSDateComponents

許多情況下你需要把日期拆成塊,並且獲取某一項的值。例如,你可能只需要獲取星期、月份或時間、小時信息。這時就要用到 NSDateComponents 類。
NSDateComponents 類經常和 NSCalendar 類搭配使用,NSCalendar 真正執行 NSDate 和 NSDateComponents 間的轉換。這樣,我們先要獲取當前的calendar。

1
let calendar = NSCalendar.currentCalendar()

現在,我們來看一個*NSDate**NSDateComponents*轉換的具體例子:
11.png

1
2
3
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: "")

第一行用的方法是 NSCalendar 的 components(_:fromDate:),這個方法接受兩個參數:第二個是日期對象;第一個參數比較有意思,它接收若干個 NSCalendarUnit 類型值,NSCAlendarUnit 用來說明需要的日期部分。
NSCalendarUnit 是一個結構體,你可以在 這個文檔 中看到所有屬性。在上面的例子中你可以看出,NSCalendarUnit 指定了以下日期組件:

  • 一年中的第幾個星期

  • 小時

  • 分鐘

  • 毫微秒

這裏需要注意:若某個組件沒有在第一個參數中指定,就無法訪問它。如:在這個例子中,我們沒有指定 NSCalendarUnit.TimeZone,這樣就無法訪問時區的組件,比如print(dateComponents.timezone)調用會造成一個運行時錯誤。如果你需要額外的日期組件,只能重新調用一次calendar.Components方法,把你需要的Calendar Unit添加進去。
date components到date對象的轉換也很簡單。這個過程中不需要使用calendar unit。只用初始換一個新的 NSDateComponents 對象,然後顯式的設置你需要的組件的值,然後調用 NSCalendar 的 dateFromComponents 方法即可。
12.png

1
2
3
4
5
6
7
let components = NSDateComponents()
components.day = 5
components.month = 01
components.year = 2016
components.hour = 19
components.minute = 30
newDate = calendar.dateFromComponents(components)

在文章的前面我們看到了如何通過設置時區來影響轉換的字符串,如果你想知道改動時區會對轉換日期對象有怎樣的影響,可以參考下面的例子:
13.png

1
2
3
4
5
6
components.timeZone = NSTimeZone(abbreviation: "GMT")
newDate = calendar.dateFromComponents(components)
components.timeZone = NSTimeZone(abbreviation: "CST")
newDate = calendar.dateFromComponents(components)
components.timeZone = NSTimeZone(abbreviation: "CET")
newDate = calendar.dateFromComponents(components)

GMT = Greenwich Mean Time(格林尼治標準時間)
CST = China Standard Time(中國標準時間)
CET = Central European Time(歐洲中部時間)
你可以在 這個鏈接 中查找時區縮寫的列表。
現在你已經知道了怎麼使用 NSDateComponents ,讓我們再來學習其他有趣的東西。

比較日期和時間

另外一個使用場景是比對日期對象,查看一個日期是否早於、晚於或等於另外一個日期。簡單說來,我會提供三種方法來比對日期對象,但不會說明哪種方法比較好一些,這些方法的差別不大,到底用哪個取決於你的需求。

開始接觸比較方法之前,我們先創建兩個自定義的日期對象作爲示例。初始化兩個date formatter對象,通過它們將格式化字符串轉換成日期對象。

1
2
3
4
5
6
dateFormatter.dateFormat = "MMM dd, yyyy zzz"
dateAsString = "Oct 08, 2015 GMT"
var date1 = dateFormatter.dateFromString(dateAsString)!
 
dateAsString = "Oct 10, 2015 GMT"
var date2 = dateFormatter.dateFromString(dateAsString)!

先來看看第一個日期比對方法,它用於判斷一個日期是否早於另外一個日期。方法名爲 earlierDate:,還有一個是 laterDate:,例如:
date1.earlierDate(date2)
這個方法效果如下:

  • 如果 date1 早於 date2,該方法返回date1

  • 如過 date2 早於 date1,該方法返回date2

  • 如果 date1 和 date2 相同,返回date1

laterDate 方法也可以用於這樣的判斷。
讓我們來看一個用到這兩個方法的例子:
14.png

1
2
3
// Comparing dates - Method #1
print("Earlier date is: \(date1.earlierDate(date2))")
print("Later date is: \(date1.laterDate(date2))")

另外一個日期比較方法是 NSDate 的 compare: 方法,它需要搭配使用 NSComparisonResult 枚舉體。通過下面的例子你就能明白我說的意思。先讓我們來看一下它的使用場景:同樣,我們有兩個日期對象需要比對,然後判斷兩個日期是否相同,如果不同,哪個更早一些。代碼如下:
16.png
結果爲:
17.png
代碼:

1
2
3
4
5
6
7
8
9
10
// Comparing dates - Method #2
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")
}

第三個比對方法有點不同,因爲它用到了時間間隔(time interval)的概念。這個方法也很簡單,它可以查找到每個日期(到現在)的時間間隔,接下來就可以進行比對。
18.png

1
2
3
4
5
6
7
8
9
10
// Comparing dates - Method #3
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")
}

上面的這些方法也可以用到時間的比對上。現在我給大家最後一個例子,這個例子和前面的不同之處在於 date1 和 date2 對象包含了時間的表示。例子中又用到了earlierDate 方法,另外,還用到了isEqualToDate:的方法,它的用法也很明顯:
20.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Comparing time.
dateFormatter.dateFormat = "HH:mm:ss zzz"
dateAsString = "14:28:16 GMT"
date1 = dateFormatter.dateFromString(dateAsString)!
dateAsString = "19:53:12 GMT"
date2 = dateFormatter.dateFromString(dateAsString)!
if date1.earlierDate(date2) == date1 {
    if date1.isEqualToDate(date2) {
        print("Same time")
    }
    else {
        print("\(date1) is earlier than \(date2)")
    }
}
else {
    print("\(date2) is earlier than \(date1)")
}

在其中你會看到“2000-01-01”的日期,你一定很好奇,因爲我們從來沒設置過這樣的日期。這是因爲若 NSDate 對象沒有指定日期,只指定時間的話,會自動添加默認的日期屬性。這不會影響到我們需要的時間值。

好了,現在你應該知道了如何比較日期對象了。

計算未來和過去的日期

計算過去和未來的日期比較有意思。這裏你會用到 NSCalendarUnitNSDateComponents 等之前瞭解過的工具。在下面的例子中,我會展示兩種不同的方法:第一種使用 NSCalendar 類和 NSCalendarUnit 結構體;第二種使用 NSDateComponents 類。最後,我們會用到第三種替代方案,但是通常情況下,不推薦使用。
首先,記住我們的當前日期(當然了,是在寫這個教程是的日期、時間)。這個日期會作爲我們的參照值。
21.png
現在,假定我們需要爲這個日期往後推兩個月又5天。最好用代碼來描述:

1
2
let monthsToAdd = 2
let daysToAdd = 5

我們先用第一種方法來獲取期望的日期,先看看代碼,稍後我會解釋:

1
2
var calculatedDate = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.Month, value: monthsToAdd, toDate: currentDate, options: NSCalendarOptions.init(rawValue: 0))
calculatedDate = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.Day, value: daysToAdd, toDate: calculatedDate!, options: NSCalendarOptions.init(rawValue: 0))

如你所見,這裏用到的方法是 NSCAlendar 類的 dateByAddingUnit:value:toDate:options: 方法。它的作用是添加某個日曆單元值(如年月日時分秒等)到現有的日期對象上,然後返回新的日期對象。我們需要添加兩個日曆單元到當前日期,直接用這個方法是不可能的(它每次只能設置一個calendar unit)。關鍵是調用兩次這個方法,設置不同的日曆單元,就能得到最終結果。
以下是在playground中調用效果,你可以看到兩次添加的結果:
22.png
這個方法在你需要設置1~2個日曆單元時,還是不錯的。當日歷單元多的時候,你就需要多次調用這個方法。
在日曆單元比較多的時候,更好的方法是使用 NSDateComponents 類。方便起見,這個例子中我們還是設置月份和天。具體做法是:初始化一個 NSDateComponents 對象,並設置月份和天的信息。然後我們調用 NSCalendar 的另一個方法 dateByAddingComponents:toDate:options:,並最終獲得我們需要的日期對象。
23.png

1
2
3
4
5
let newDateComponents = NSDateComponents()
newDateComponents.month = monthsToAdd
newDateComponents.day = daysToAdd
 
calculatedDate = NSCalendar.currentCalendar().dateByAddingComponents(newDateComponents, toDate: currentDate, options: NSCalendarOptions.init(rawValue: 0))

注意:在以上調用 NSCalendar 方法的地方,最後一個參數options都沒有被設置。如果你需要具體設置options的值,請參考完整的 官方文檔
第三種方法實際上並不推薦使用,因爲閏秒、閏年或日光節約時間的緣故,它經常會得到錯誤的結果。這個方法的思路是爲當前的日期添加一個時間段。我們會用到 NSDate 的 dateByAddingTimeInterval: 方法。在下面的例子中,我們要獲得計算1.5小時後的時間。

1
2
let hoursToAddInSeconds: NSTimeInterval = 90 * 60
calculatedDate = currentDate.dateByAddingTimeInterval(hoursToAddInSeconds)

再次說明一下,上述的前兩種方法更安全和通用。你可以按照需求選擇使用。
上面的三個例子都是爲當前日期對象添加某些日曆單元的值。那麼如何通過減去一些天數來獲取之前的日期?
接下來的例子可以完成這個任務。首先,我們可以爲當前日期添加一個負值,這樣就可以得到之前的日期。然後通過格式化的方式獲取字符串結果。這個結果比較有意思。
24.png

1
2
3
4
5
let numberOfDays = -5684718
calculatedDate = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.Day, value: numberOfDays, toDate: currentDate, options: NSCalendarOptions.init(rawValue: 0))
 
dateFormatter.dateFormat = "EEEE, MMM dd, yyyy GGG"
dateAsString = dateFormatter.stringFromDate(calculatedDate!)

上面的這些代碼片段可以幫助你理解計算過去和之前日期的方法。你可以自己試試改變這些代碼,看看有什麼不一樣的結果。這樣就可以更深入的理解這些功能。

計算日期間隔

正如開頭說的那樣,計算日期間隔也是你在工作過程中可能遇到的任務。在教程的最後部分,我將通過三種方式展示如何計算 NSDate 對象的間隔。你可以按照需要選擇適用的方法。
首先,我們還是需要創建兩個自定義的 NSDate 對象:

1
2
3
4
5
6
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)!

我們先來看看如何通過date components來計算日期對象間隔。我們又會用到 NSCalendar 類的一個方法。然後打印出各個日期部分的結果。顯然,只要有可用的date components,通過這種方法獲取需要的結果是很簡單的:
25.png

1
2
3
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")

這個新方法叫 components:fromDate:toDate:options:,第一個參數是 NSCalendarUnit 值的數組。這裏要注意,如果第一個日期如果晚於第二個日期,則結果會返回負值。
另外兩種方法中,我們將第一次用到 NSDateComponentsFormatter 類,它提供了多種用於自動計算日期間隔的方法,並可以返回格式化字符串結果。首先,我們創建一個date components formatter對象,這裏只指定一個屬性:

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

unitsStyle 屬性指定我們使用的 dateComponentsFormatter 以何種格式打印日期的間隔。例如,這裏我們使用 完整 樣式,這樣天數、月數等名字(如days,months)都會被顯示出來。如果我們設置 縮寫 樣式,就會顯示縮寫名字(天數顯示爲d等)。你可以在 這個鏈接 中查找到所有的樣式:
讓我們繼續會到日期間隔計算的話題上。我們先計算日期的間隔,再把該值傳遞給*stringFromTimeInterval:*方法,這樣,就能獲得日期間隔的字符串表示:
26.png

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

最後,第三種計算的方法中,我們將兩個日期傳遞給 NSDateComponentsFormatter 對象的一個叫 stringFromDate:toDate: 的方法。但是這個方法需要有個前置的條件NSDateComponentsFormatter 的 allowedUnits 屬性必須被提前設置,這個屬性接受數組類型的值,這裏至少要設置一個日曆單元的值。否則這個方法會返回nil值。所以,在這個方法的使用中,我們“告訴”它需要獲取哪些日曆單元,它會按照對應的日曆單元返回結果:
27.png

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

原文:http://www.cocoachina.com/swift/20151126/14430.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章