// Swift let dateString = "2018-03-15T16:37:29Z" // the date string to be parsed let df = DateFormatter() df.locale = Locale(identifier: "en_US_POSIX") df.dateFormat = "yyyy-MM-dd'T'HH:mm:ssX" if let date = df.date(from: dateString) { // do something with the date } else { print("Unable to parse date string") } // Objective-C NSString *dateString = "2018-03-15T16:37:29Z"; // the date string to be parsed NSDateFormatter *df = [[NSDateFormatter alloc] init]; df.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; df.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssX"; NSDate *date = [df dateFromString:dateString]; if (date) { // do something with the date } else { NSLog(@"Unable to parse date string"); }
需要注意的是:
如果字符串符合 ISO 8601 标准(如上例),最好使用
ISO8601DateFormatter
。
末尾的
Z
表示时区。
Z
念 “Zulu”,表示 +0000,即 UTC 时区。
如果字符串已经包含时区,则没有必要再次设置
DateFormatter
的时区。
格式字符串务必包含常量字符
T
。
时区的占位符是
X
。虽然人们常常用
Z
表示时区,但严格来说这是不正确的用法。不过
DateFormatter
在实际解析时会自动纠正这类错误。不过,最好按规则使用。
date(from:)
返回
Date
。但如果无法解析,则返回空。所以,对于来自 API 或服务器的数据,必须校验,编写防御代码。不要对数据做任何假设,如果服务器改变格式,就会导致程序崩溃。务必优雅的处理意外状况。