dateByAddingComponents:toDate:options return 什么时候为零?

When does dateByAddingComponents:toDate:options return nil?

我一直在使用 dateByAddingComponents:toDate:options:dateByAddingUnit:value:toDate:options: 并使用可选绑定来获取日期。像这样:

guard let startOfNextMonth = calendar.dateByAddingComponents(oneMonthComponent, toDate: startOfThisMonth, options: []) else {
    return nil
}

其中 oneMonthComponent 只是一个月份值设置为 1 的 NSDateComponent。

当我读到它时,在文档中他们都说了类似的话:

Returns nil if date falls outside the defined range of the receiver or if the computation cannot be performed.

而且我一直在想,这到底是什么时候造成的。如果我只是在日期上加一个月,有没有办法可以为零?这是因为其他历法系统存在一些差异,添加一些单位没有意义吗?

我四处搜索,但一直无法找到它 return nil 的实例。

有没有什么可以使上面的代码为零?添加组件可能为零的示例是什么?

实际上,如果您只是在日期上加上一个月,您将不会得到 nil 个值。

不过,在某些退化的情况下,您可以获得 nil 值。例如,如果您使用的是伊斯兰历并添加 -9,999,999 年,您将得到 nil(但奇怪的是,在其他日历中没有)。在这些极端情况下,其他日历通常会 overflow/wrap 年份(即使您希望它们 return nil,根据您引用的文档)。

就我个人而言,我怀疑目前很少有情况会获得 nil 值。我尝试了各种极端值,伊斯兰历是我唯一成功获得 nil 值的日历。不过,这并不意味着 Apple 将来可能不会添加更强大的日期验证逻辑。我们可能必须从 Apple 那里获得建议(或查看 NSCalendar 的源代码)才能明确回答这个问题。

所以,最重要的是,我建议保留您的 guard 声明,但它不太可能在现实世界中失败。