swift 2.0 NSDateFormatter中的错误?

时间:2015-10-06 13:09:14

标签: swift nsdateformatter

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

这几乎肯定是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"

1 个答案:

答案 0 :(得分: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,当它从字符串中没有收到 time 信息时,它会假定时区中的时间为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