什么时候dateByAddingComponents:toDate:options返回nil ?



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

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

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

当我读到它的时候,在文档中他们都这样说:

如果日期超出接收者的定义范围或计算无法执行,则返回nil。

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

我已经搜索了周围,一直无法找到一个实例,它会返回nil。

是否有任何东西可以使上面的代码为nil?有什么例子可以添加零分量?

在实践中,如果您只是在日期中添加一个月,则不会得到nil值。

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

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

所以,底线,我建议保留您的guard语句,但它不太可能在实际场景中失败。

最新更新