【问题标题】:NSDateFormatter.dateFromString returns nil ("yyyy-MM-dd" to NSDate)NSDateFormatter.dateFromString 返回 nil ("yyyy-MM-dd" 到 NSDate)
【发布时间】:2015-09-22 14:50:38
【问题描述】:

NSDateFormatter 有问题。

所以我有一个格式为 "yyyy-MM-dd" 的日期字符串,例如 2015-09-22。 但是,当我将它传递给 NSDateFormatter.dateFromString 时,该方法返回 nil。我的代码如下:

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
let dateAsNSDate = dateFormatter.dateFromString(payload.objectForKey("messageExpiry") as! String)

在此代码上方的断点处从调试器控制台:

po payload.objectForKey("messageExpiry") as! String

"2015-09-31"

我已经探索过与此类似的其他问题,但至今仍无法解决此问题。 任何和所有的帮助将不胜感激。

【问题讨论】:

  • 这应该适用于“2015-09-22”(在我的测试中也适用)。对于“2015-09-31”,返回 nil,因为 9 月只有 30 天。

标签: string swift nsdate nsdateformatter nslocale


【解决方案1】:

您的代码是正确的并产生了预期的结果,例如为了 输入字符串“2015-09-22”。但是,对于输入“2015-09-31”, nil 被返回,因为那是一个无效的日期:九月有 只有 30 天。

你可以设置

dateFormatter.lenient = true

然后“2015-09-31”被接受并被视为“2015-10-01”。 但你应该先检查为什么 payload.objectForKey("messageExpiry") 返回一个无效的日期。

【讨论】:

  • 哇!我不敢相信我是那么愚蠢!对于这个例子,payload.objectForKey("messageExpiry") 是由我在其他地方手动设置的,所以我应该为不正确的值负责。我想很容易做到...谢谢!
【解决方案2】:
var str = "2015-09-29"

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
let dateAsNSDate = dateFormatter.dateFromString(str)
print(dateAsNSDate)
// -> "Optional(2015-09-29 07:00:00 +0000)\n"

所以这似乎可行。看起来您一个月的天数太多了,所以这不是一个有效的日期! :)

【讨论】:

  • 谢谢!多么愚蠢的错误哈哈,我想很容易做到!
猜你喜欢
  • 2020-02-24
  • 2012-02-17
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 2013-02-22
相关资源
最近更新 更多