NSDateFormatter在swift和iOS SDK 8.0中返回nil

Han*_*nXu 8 ios

我正在阅读Raywenderlich提供的教程,第29章测试的新功能,并遇到一个奇怪的问题.

以下是教程中将字符串转换为日期的代码:

// Convert date string to date.
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz"
var date: NSDate? = dateFormatter.dateFromString(dateString)
Run Code Online (Sandbox Code Playgroud)

dateString是表单的

2014-06-21 14:56:00 EST
Run Code Online (Sandbox Code Playgroud)

但是,日期变量始终为零.

注意:在操场上播放此代码时,它可以正常工作,如图所示:

在此输入图像描述

我在iOS SDK 8.0中工作.这是SDK的错误吗?


更新

我正在使用iOS 8的最新iPod Touch进行测试.

Abh*_*ert 13

设置dateFormat字符串时,还必须将locale属性设置为与提供的格式兼容的属性.否则,区域设置将基于可能不兼容的设备设置.

您在此处提供的日期格式将使用"en"语言环境,但它不适用于许多其他语言,例如"eu".这是一个例子:

let dateString = "2014-06-21 14:56:00 EST"

let localeStr = "eu" // this will give nil
let localeStr = "us" // this will succeed

let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: localeStr)
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz"
var date: NSDate? = dateFormatter.dateFromString(dateString)
Run Code Online (Sandbox Code Playgroud)

这里的问题是"EST",它只存在于北美洲.在所有其他语言环境中,它是无效的时区.如果您将日期字符串更改为:

"2014-06-21 14:56:00 UTC-5"
Run Code Online (Sandbox Code Playgroud)

然后,无论locale设置什么值,日期都将正确格式化.


rin*_*aro 5

NSDateFormatter的行为在很大程度上取决于它locale.默认情况下,它使用设备区域设置.如果您想要一致的结果,您应该手动指定locale.在大多数情况下,en_US_POSIX是最好的.

该文件说:

如果您正在使用固定格式的日期,则应首先将日期格式化程序的区域设置设置为适合您的固定格式的区域设置.在大多数情况下,最佳选择的语言环境是en_US_POSIX,这是一种专门设计用于产生美国英语结果的语言环境,无论用户和系统偏好如何.en_US_POSIX在时间上也是不变的(如果美国,在未来的某个时刻,它会改变格式化日期的方式,en_US将改变以反映新行为,但en_US_POSIX将不会),以及平台之间(en_US_POSIX在iPhone上的工作方式相同)操作系统与OS X上的操作系统一样,并且与其他平台上的操作系统相同.

像这样:

let dateString = "2014-06-21 14:56:00 EST"

let dateFormatter = NSDateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss zzz"
var date: NSDate? = dateFormatter.dateFromString(dateString)
Run Code Online (Sandbox Code Playgroud)