我在模拟器和iPhone 6+中使用NSDateFormatter在swift中实际运行时遇到了一个奇怪的问题。我尝试使用以下扩展名将JSON中的特定格式的字符串转换为NSDate:
extension String {
var asStringDate: NSDate? {
get {
let dateFormatter = NSDateFormatter()
let offsetTime = NSTimeInterval(NSTimeZone.localTimeZone().secondsFromGMT) //support local timezone
dateFormatter.locale = NSLocale.currentLocale()
dateFormatter.dateFormat = "EEE, d MMM yyyy H:mm"
if let date = dateFormatter.dateFromString(self) {
let finalDate = date.dateByAddingTimeInterval(offsetTime) //support local timezone
// if Constants.debug { println("\(self) -> \(finalDate)") } //For debugging purposes
return finalDate
}
println("Error while formating string:'\(self)' to date in String.asStringDate") //For debugging purposes
return nil
}
}
出于某种原因,在模拟器上运行正常,但是从我的iPhone上的Xcode运行时我得到的是
dateFormatter.dateFromString(self)
我得到的字符串示例:"星期五,2015年6月19日15:52" 任何想法为什么它在iPhone中失败?
答案 0 :(得分:0)
将日期字符串解析为日期对象时的不同行为是由设备和模拟器上的不同语言环境引起的。根据不同的区域设置,您需要相应地更改日期格式。
如果您获得的日期字符串是由后端服务器设置的,则需要确保它以ISO 8601格式设置(例如2015-08-02T21:50:49Z),以便可以轻松解析并在任何语言环境中转换为日期对象。
答案 1 :(得分:0)
我终于明白了,问题在于:
dateFormatter.locale = NSLocale.currentLocale()
其中我设置了currentLocale,在我固定到特定区域设置而不是默认区域的那一刻(在iPhone和Mac中显然不一样,所以每个都有不同的值)。 将行更改为:
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
解决了问题,现在扩展按预期工作了。