Swift NSDate iso 8601格式

时间:2016-09-23 23:41:24

标签: ios swift nsdate nsdateformatter iso8601

我正在研究swift中的日期格式。尝试将字符串日期转换为NSDate,将NSSate转换为字符串日期(ISO 8601格式)

这是我的代码

let stringDate = "2016-05-14T09:30:00.000Z" // iso 8601 format 

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" //iso 8601

let date = dateFormatter.dateFromString(stringDate)
print("Date = \(date)") // Output is 2016-05-14 16:30:00 +0000

// again converting it date to string using stringFromDate 
print("\(dateFormatter.stringFromDate(date!))") // 2016-05-14T09:30:00.000Z

我想了解为什么我会以GMT格式获得NSDate(在09:30到16:30之间增加7小时)? 如果我将该NSDate date变量转换为字符串,那么我将获得原始字符串日期。谁能帮我理解这里发生了什么?

3 个答案:

答案 0 :(得分:3)

您可以将NSISO8601DateFormatterISO8601DateFormatter用于Swift 3.0 +

答案 1 :(得分:2)

您的格式字符串错误。您指明文字Z而不是“Z作为祖鲁时间”。删除单引号:

dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")

您应始终将区域设置指定为en_US_POSIX when parsing internet time。这是如此普遍被忽视,以至于Apple在OS X 10.12中创建了ISO8601DateFormatter

答案 2 :(得分:0)

如果您定位的是iOS 11.0+ / macOS v10.13 +(高Sierra),则可以简单地将self.view.window?.title = titleISO8601DateFormatterwithInternetDateTime选项结合使用,如下所示:

withFractionalSeconds

要在旧系统上使用let stringDate = "2016-05-14T09:30:00.000Z" // ISO 8601 format let iso8601DateFormatter = ISO8601DateFormatter() iso8601DateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] let date = iso8601DateFormatter.date(from: stringDate) print("Date = \(date)") // Output is 2016-05-14 09:30:00 +0000 ,请参见Apple Tech Note QA1480

如果您使用固定格式的日期,则应首先设置 日期格式化程序的语言环境应适合您的固定格式 格式。在大多数情况下,最佳选择的语言环境是“ en_US_POSIX” 专为产生美国英语成绩而设计的语言环境 无论用户和系统偏好设置如何。 “ en_US_POSIX”也是 时间不变(如果美国在将来的某个时候改变了 格式化日期的方式,“ en_US”将更改以反映新的 行为,但“ en_US_POSIX”不会)和机器之间 (“ en_US_POSIX”在iOS上的工作原理与在OS X上以及在OS X上一样 在其他平台上使用。

根据提供的示例代码,这是Swift 5的摘要:

DateFormatter