【问题标题】:Bug in swift 2.0 NSDateFormatter? [duplicate]swift 2.0 NSDateFormatter 中的错误? [复制]
【发布时间】:2015-10-06 13:09:14
【问题描述】:

NSDateFormatter 似乎不喜欢 10 月 18 日。每隔一天尝试一次,成功。 (???)

这几乎可以肯定是 swift 2.0 中的一个错误(如果是我该怎么办?我需要尽快提交我的应用程序)。我错过了什么吗?

在 Xcode 7.0.1 的操场上检查过:

let str = "2015-10-18"
let str2 = "2015-10-14"

let formatter = NSDateFormatter()
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd"

var date = formatter.dateFromString(str)
var date2 = formatter.dateFromString(str2)

输出:

"2015-10-18"
"2015-10-14"

<NSDateFormatter: 0x7f8aa050b760>
<NSDateFormatter: 0x7f8aa050b760>
<NSDateFormatter: 0x7f8aa050b760>

nil
"Oct 14, 2015, 12:00 AM"

【问题讨论】:

  • 这肯定不是 Swift 2 中的错误,因为我刚刚使用了您的代码 without errors。 :)
  • @EricD。这很奇怪。我有同样的错误。您使用的是哪个 XCode 版本?
  • @Caio Xcode 7 GM。也适用于 Xcode 7.1 beta。
  • 您使用的是哪个时区? America/Campo_GrandeAmerica/CuiabaAmerica/Sao_Paulo 返回 nil
  • 谢谢 Leo Dabus!你说对了。由于我没有指定时间,它假定它是午夜,但由于第一天是白天,所以没有午夜,直接跳到凌晨 1 点。

标签: swift nsdateformatter


【解决方案1】:

行为取决于格式化程序使用的timeZone

例如:America/Sao_Paulo

在圣保罗,http://www.timeanddate.com/time/change/brazil/sao-paulo?year=2015

2015 年 10 月 18 日星期日,00:00:00 时钟拨快 1 小时至 改为 2015 年 10 月 18 日星期日 01:00:00 当地时间

也就是说,圣保罗没有2015-10-18 00:00:00

而对于NSDateFormatter,当它没有收到来自字符串的时间信息时,它假定时间是00:00:00在它的时区。这就是它返回 nil 的原因。

let formatter = NSDateFormatter()
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.timeZone = NSTimeZone(name: "America/Sao_Paulo")
formatter.dateFormat = "yyyy-MM-dd HH:mm"

formatter.dateFromString("2015-10-18 00:00") // -> nil
formatter.dateFromString("2015-10-18 00:30") // -> nil
formatter.dateFromString("2015-10-18 01:00") // -> non nil

正如@LeoDabus 所说,当您在格式化程序上指定.calendar 时:

它假设时间是00:00:00 在它的时区。

它将假定该日期的开始。

let formatter = NSDateFormatter()
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.timeZone = NSTimeZone(name: "America/Sao_Paulo")
formatter.dateFormat = "yyyy-MM-dd"
formatter.calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)

formatter.dateFromString("2015-10-17") // -> Oct 17, 2015, 12:00 AM
formatter.dateFromString("2015-10-18") // -> Oct 18, 2015, 1:00 AM
formatter.dateFromString("2015-10-19") // -> Oct 19, 2015, 12:00 AM

【讨论】:

  • 此行为实际上取决于您是否指定日历。如果您这样做,它将假定特定语言环境的该日期的开始日期。在这种情况下,凌晨 1 点,因此无需指定时间。
  • 你好 Leo,我在使用 Objective-C 时遇到了同样的问题,你能帮我编写 Objective-C 类似的代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 2015-08-29
相关资源
最近更新 更多