Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift NSDate ISO 8601格式_Ios_Swift_Nsdate_Nsdateformatter_Iso8601 - Fatal编程技术网

Ios Swift NSDate ISO 8601格式

Ios Swift NSDate ISO 8601格式,ios,swift,nsdate,nsdateformatter,iso8601,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 da

我正在研究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
变量转换为字符串,那么我将获得原始字符串日期。这里发生了什么?

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

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

您应该始终将区域设置指定为
en\u US\u POSIX
。这一点经常被忽视,以至于苹果在(Sierra)中创建了
ISO8601DateFormatter
类。

如果你的目标是iOS 11.0+/+(High Sierra),你可以使用
ISO8601DateFormatter
with InternetDateTime
with FractivelSeconds
选项,像这样:

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
有关在旧系统上使用日期格式化程序的信息,请参阅:

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

以下是基于提供的示例代码的Swift 5片段:

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

let rfc3339DateFormatter = DateFormatter()
rfc3339DateFormatter.locale = Locale(identifier: "en_US_POSIX")
rfc3339DateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSS'Z'"
rfc3339DateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
let date = rfc3339DateFormatter.date(from: stringDate)

print("Date = \(date)") // Output is 2016-05-14 09:30:00 +0000

您的目标是macOS 10.12还是更高版本?有一个新类
ISO8601DateFormatter
可能会有所帮助。否。我正在开发macOS 10.11.6和iOS 9。我将检查该类
ISO8601数据格式化程序
。谢谢