当我执行以下操作时(2017年1月7日):
let dateComponents = Calendar.current.dateComponents(in: TimeZone.current, from: date)
print("dateComponents = \(dateComponents)")
let trigger = UNCalendarNotificationTrigger(dateMatching:dateComponents, repeats: false)
let nextDate = trigger.nextTriggerDate()
print("nextDate = \(nextDate)")
然后我得到以下输出:
dateComponents = calendar:gregorian(current)timeZone:Europe / Stockholm(当前)时代:1年:2017月:1天:8小时:21分钟:34秒:0纳秒:0个工作日:1个工作日原点:2个季度:0 weekOfMonth:1 weekOfYear:1 yearForWeekOfYear:2017 isLeapMonth:false nextDate = nil
问题:为什么 trigger.nextTriggerDate() = nil
?
UPDATE: 我感觉我的 dateComponents
可能超定了 . 因此,我引入了一个仅包含dateComponents的日期时间和分钟的 nextEvent
:
var nextEvent = DateComponents()
nextEvent.day = dateComponents.day
nextEvent.hour = dateComponents.hour
nextEvent.minute = dateComponents.minute
let trigger = UNCalendarNotificationTrigger(dateMatching:nextEvent, repeats: false)
当我现在调用 trigger.nextTriggerDate()
时,它变成了
nextDate = Optional(2017-01-08 20:34:00 +0000)
正如它应该 . 但是我不明白为什么在创建触发器时我不能使用dateComponents .
1 回答
在我的测试中,我发现
dateComponents.quarter = 0
是导致问题的原因 . 零季度显然是错误的,它应该是quarter = 1
似乎有一个旧的bug导致日期组件有一个无效的季度 .如果你手动设置
dateComponents.quarter = 1
或只是dateComponents.quarter = nil
,一切都开始工作 .