我正在研究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
变量转换为字符串,那么我将获得原始字符串日期。谁能帮我理解这里发生了什么?
答案 0 :(得分:3)
您可以将NSISO8601DateFormatter或ISO8601DateFormatter用于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 = title
与ISO8601DateFormatter
和withInternetDateTime
选项结合使用,如下所示:
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