swift 2.0 NSDateFormatter 中的错误?
Bug in swift 2.0 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"
行为取决于 timeZone
格式化程序使用的格式。
例如:America/Sao_Paulo
在圣保罗,http://www.timeanddate.com/time/change/brazil/sao-paulo?year=2015
Sunday, 18 October 2015, 00:00:00 clocks are turned forward 1 hour to
Sunday, 18 October 2015, 01:00:00 local daylight time instead
也就是说,圣保罗没有2015-10-18 00:00:00
。
而对于NSDateFormatter
,当它没有从字符串中收到时间信息时,它假定时间是其时区的00:00:00
。这就是为什么 returns 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
时:
it assumes the time is 00:00:00
in its timezone.
it will assume the start of the day for that date.
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
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"
行为取决于 timeZone
格式化程序使用的格式。
例如:America/Sao_Paulo
在圣保罗,http://www.timeanddate.com/time/change/brazil/sao-paulo?year=2015
Sunday, 18 October 2015, 00:00:00 clocks are turned forward 1 hour to Sunday, 18 October 2015, 01:00:00 local daylight time instead
也就是说,圣保罗没有2015-10-18 00:00:00
。
而对于NSDateFormatter
,当它没有从字符串中收到时间信息时,它假定时间是其时区的00:00:00
。这就是为什么 returns 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
时:
it assumes the time is00:00:00
in its timezone.it will assume the start of the day for that date.
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