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"
答案 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