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

时间:2016-09-06 21:29:18

标签: ios swift nsdate nscalendar nsdatecomponents

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

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

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

当我读到它时,在文档中他们都说了如下:

  

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

我一直在想,究竟是什么时候造成的。如果我只是在某个日期添加一个月,有没有办法可以为零?这是因为在其他日历系统中存在一些差异,在这些系统中添加某些单元并不合理吗?

我已经四处寻找并且无法找到一个返回nil的实例。

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

1 个答案:

答案 0 :(得分:5)

实际上,如果您只是在某个日期添加一个月,则不会获得nil个值。

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

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

所以,最重要的是,我建议保留你的guard声明,但在实际情况下它不太可能失败。