Swift开发中哪些场景会导致Calendar.current.date(byAdding返回nil
Calendar.current.date(byAdding:value:to:) 返回nil的实际场景 你测试的夏令时切换场景没有返回nil,是因为iOS日历默认开启了宽松计算模式(isLenient = true),会自动将不存在的时间映射到最近的有效时间,不会触发nil返回。实际会触发该方法返回nil的场景主要有以下几类:
- 计算结果超出当前日历的有效表示范围
系统内置的所有日历类型都有可表示的时间范围边界,比如常用的公历(格里高利历)的有效范围远小于Date类型的可表示范围,如果你对靠近边界的Date执行超大跨度的加法(比如给公元1年的日期加100万年),超出日历支持范围后就会返回nil。 - 计算结果超出Calendar手动设置的时间限制
如果你为当前Calendar手动设置了minimumDate、maximumDate属性,只要加法计算后的结果落在这个限定范围之外,方法就会返回nil。 - 使用配置异常的Calendar实例
如果不使用默认的Calendar.current,而是手动创建Calendar实例时传入了非法的标识符、或者手动修改配置导致日历参数冲突,调用该方法时也可能返回nil。 - 开启严格校验模式后的非法时间场景
如果你手动将Calendar的isLenient属性设置为false(开启严格校验),此时如果加法计算后的结果落在夏令时切换不存在的时间区间、或是不符合当前历法规则的日期区间,方法就会返回nil。 - 特殊历法的不存在日期场景
部分阴阳合历(比如农历、希伯来历)存在特殊的置闰规则,当添加组件后的日期落在历法中不存在的虚拟时间区间时,也可能返回nil。
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

