1. 程式人生 > >使用 Swift 3.0 操控日期

使用 Swift 3.0 操控日期

字符 一個 local 3-0 uil num 喜歡 posix fmt

作者:Joe,原文鏈接,原文日期:2016-09-20
譯者:Cwift;校對:walkingway;定稿:CMB

當你在想要 大規模重命名 時,一個附帶的挑戰就是要確保所有相關的文檔都必須同步更新。比如,截至到 2016 年 9 月 20 日,DateFormatter 的文檔依舊沒有與版本統一,引用的是 Swift 2.3 風格的 API(譯者註:現在是 2017年,文檔依舊沒有更新...)。隨著時間的推移,這些疏漏毫無疑問都會被糾正,這裏是一些使用 Date 以及 DateFormatter 實現的日期格式化的示例。

官方文檔中當前的示例如下:


let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .mediumStyle
dateFormatter.timeStyle = .noStyle
 
let date = Date(timeIntervalSinceReferenceDate: 118800)
 
// US English Locale (en_US)
dateFormatter.locale = Locale(localeIdentifier: "en_US")
NSLog("%@", dateFormatter.stringFromDate(date)) // Jan 2, 2001
 
// French Locale (fr_FR)
dateFormatter.locale = Locale(localeIdentifier: "fr_FR")
NSLog("%@", dateFormatter.stringFromDate(date)) // 2 janv. 2001
 
// Japanese Locale (ja_JP)
dateFormatter.locale = Locale(localeIdentifier: "ja_JP")
NSLog("%@", dateFormatter.stringFromDate(date)) // 2001/01/02

在 Swift 3.0 中變為:


let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none

註意 .mediumStyle 被簡化為 .medium。這種簡化符合規則,我們知道類型是 DateFormatter.Style 所以沒有理由重復 Style 一詞。使用 .none 替換 .noStyle 也是同理。

現在看看設置格式化器的環境時發生的改動:


// US English Locale (en_US)
dateFormatter.locale = Locale(identifier: "en_US")
print(dateFormatter.string(from:date)) // Jan 2, 2001
 
// French Locale (fr_FR)
dateFormatter.locale = Locale(identifier: "fr_FR")
print(dateFormatter.string(from:date)) // 2 janv. 2001
 
// Japanese Locale (ja_JP)
dateFormatter.locale = Locale(identifier: "ja_JP")
print(dateFormatter.string(from:date)) // 2001/01/02

再一次,我們看到了從 Locale(localeIdentifier:)Locale(identifier:) 的簡化。減少了類型名及其引用。類似地,DateFormatterstringFromDate 方法已經被簡化為 string(from:),完整的方法簽名是 string(from:Date)。理解這種模式了嗎?

繼續用一個 String 描述的信息生成一個 Date 對象,蘋果的文檔展示了這樣的示例:


let RFC3339DateFormatter = DateFormatter()
RFC3339DateFormatter.locale = Locale(localeIdentifier: "en_US_POSIX")
RFC3339DateFormatter.dateFormat = "yyyy-MM-dd‘T‘HH:mm:ssZZZZZ"
RFC3339DateFormatter.timeZone = TimeZone(forSecondsFromGMT: 0)
 
let string = "1996-12-19T16:39:57-08:00"
let date = RFC3339DateFormatter.dateFromString(string)

為了減少啰嗦和不必要的詞匯,得到了下面的寫法:


let RFC3339DateFormatter = DateFormatter()
RFC3339DateFormatter.locale = Locale(identifier: "en_US_POSIX")
RFC3339DateFormatter.dateFormat = "yyyy-MM-dd‘T‘HH:mm:ssZZZZZ"
RFC3339DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
 
let string = "1996-12-19T16:39:57-08:00"
let date = RFC3339DateFormatter.date(from:string)

TimeZone 構造器中刪除了無關的三個字符(for),而且正如期望, dateFromString 方法變成了 date(from:)

經驗法則

從 Swift 2 轉換到 Swift 3 時,一個通用法則是:去除多余的單詞。如果你之前習慣了寫 formatter.timeStyle = .fullStyle,現在你要習慣 formatter.timeStyle = .full 的寫法。如果你看到了 someTypeFromAnotherType() 這樣的寫法,它可能已經被替換為 someType(from:AnotherType)。說一下我的體驗,在使用 Swift 3 幾個月時間後,再回到 Swift 2 會感覺命名過於冗長,這還是在我喜歡這種詳細自說明語言風格的前提下。不過一旦你學會了 Swift,你會擁抱海明威而避開托爾斯泰。

愉快地 Swift 吧!

本文由 SwiftGG 翻譯組翻譯,已經獲得作者翻譯授權,最新文章請訪問 http://swift.gg。

使用 Swift 3.0 操控日期