swift - swift 2.0 NSDateFormatter 中的错误?

标签 swift nsdateformatter

NSDateFormatter 似乎不喜欢十月十八日。尝试了所有其他约会,均取得成功。 (???)

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

在 Xcode 7.0.1 上的 Playground 中检查它:

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

例如:美国/圣保罗

在圣保罗,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时区。这就是为什么它返回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

关于swift - swift 2.0 NSDateFormatter 中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32970869/

相关文章:

swift - NSDateFormatter 删除时间时减去一天

ios - NSTimeZone timeZoneWithName缩写在不同设备上显示不同的缩写

objective-c - 转义 NSDateFormatter 字符串

ios - 用户强制退出应用程序时重新连接蓝牙 4.0 连接

ios - scrollToItemAtIndexPath iOS swift

swift - 定时器只执行一次函数

iphone - 格式化字符串中的日期

ios - 以编程方式检查 iOS 是否支持 CallKit API

ios - 'UILabel ?' does not have a member named ' 文本'

ios - NSDateFormatter:stringFromDate 和 dateFromString 不可逆?