NSCalendar 的 calendar.rangeOfUnit 函数中存在错误?

Bug in NSCalendar's calendar.rangeOfUnit func?

我做了一个快速游乐场 here 来展示 NSCalendar 的 rangeOfUnit 函数中的一个错误。

经过一些初始陈述后,您可以看到我对

的输出
let secs = calendar.rangeOfUnit(.Second, inUnit: .Month, forDate: firstOfMonth!).length

是 60。我期待看到 2678400(60 秒 * 60 分钟 * 24 小时 * 31 天)。我做错了什么吗?

我还想我会用几乎微不足道的东西强调 func

let months = calendar.rangeOfUnit(.Month, inUnit: .Month, forDate: firstOfMonth!).length

并对结果值 9223372036854775807 感到困惑。有人对此有解释吗?

我认为您正在寻找 ordinalityOfUnit() 方法

首先我们需要月末日期。

var firstOfMonth:NSDate? = nil
var seconds: NSTimeInterval = 0
calendar().rangeOfUnit(.Month, startDate: &firstOfMonth, interval: &seconds, forDate: NSDate())
let endOfMonth = firstOfMonth?.dateByAddingTimeInterval(seconds-1)

我们做不到

let secs = calendar().ordinalityOfUnit(.Second, inUnit: .Month, forDate: endOfMonth!)

secs 现在持有 2678400

let min = calendar().ordinalityOfUnit(.Minute, inUnit: .Month, forDate: endOfMonth!)
let hour= calendar().ordinalityOfUnit(.Hour, inUnit: .Month, forDate: endOfMonth!)

922337203685477580710 == 1111111111111111111111111111111111111111111111111111111111111112
这个数字是64bit中最高的Int值。
还有 NSNotFound = NSIntegerMax

func rangeOfUnit(_: inUnit:forDate:) -> NSRange 文档状态

[…] Returns {NSNotFound, NSNotFound} if larger is not logically bigger than smaller in the calendar, or the given combination of units does not make sense […]