如何生成日期时间戳,使用
ISO 8601和
RFC 3339的格式标准?
目标是一个字符串,看起来像这样:
"2015-01-01T00:00:00.000Z"
格式:
>年,月,日,作为“XXXX-XX-XX”
>字母“T”作为分隔符
>小时,分钟,秒,毫秒,作为“XX:XX:XX.XXX”。
>字母“Z”作为零偏移的区域标记,a.k.a. UTC,GMT,祖鲁时间。
最佳案例:
> Swift源代码简单,简单,直观。
>无需使用任何额外的框架,子项目,cocoapod,C代码等。
我搜索StackOverflow,谷歌,苹果等,并没有找到一个Swift答案这个。
最有希望的课程是NSDate,NSDateFormatter,NSTimeZone。
相关Q& A:How do I get ISO 8601 date in iOS?
这是我到目前为止最好的:
var Now = NSDate() var formatter = NSDateFormatter() formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) println(formatter.stringFromDate(Now))
Xcode 8.2•Swift 3.0.2
extension Date {
static let iso8601Formatter: DateFormatter = {
let formatter = DateFormatter()
formatter.calendar = Calendar(identifier: .iso8601)
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
return formatter
}()
var iso8601: String {
return Date.iso8601Formatter.string(from: self)
}
}
extension String {
var dateFromISO8601: Date? {
return Date.iso8601Formatter.date(from: self)
}
}
用法:
let stringFromDate = Date().iso8601 // "2016-06-18T05:18:27.935Z"
if let dateFromString = stringFromDate.dateFromISO8601 {
print(dateFromString.iso8601) // "2016-06-18T05:18:27.935Z"
}
Xcode 7.3.1•Swift 2.2.1
extension NSDate {
struct Formatter {
static let iso8601: NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierISO8601)
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
return formatter
}()
}
var iso8601: String { return Formatter.iso8601.stringFromDate(self) }
}
extension String {
var dateFromISO8601: NSDate? {
return NSDate.Formatter.iso8601.dateFromString(self)
}
}
用法:
let stringFromDate = NSDate().iso8601 // "2016-06-18T05:18:27.935Z"
if let dateFromString = stringFromDate.dateFromISO8601 {
print(dateFromString.iso8601) // "2016-06-18T05:18:27.935Z"
}