在我的应用程序中,我需要获取之前的凌晨 4 点,而不是当前日期的凌晨 4 点。
例如:
- if it's
March 05, 10:00 am
那么我应该期待回来:March 05, 4:00 am
- if it's
March 05, 02:00 am
那么我应该期待回来:March 04, 4:00 am
为了实现我正在使用的Calendar.nextDate
。它适用于每月的每一天(每月最后一天除外)。
这是快乐路径的示例,它按预期工作:
let components = DateComponents(hour: 4, minute: 0, second: 0)
let date = Calendar.current.date(from: DateComponents(year: 2018,
month: 03,
day: 05,
hour: 13,
minute: 25,
second: 0))!
let result = Calendar.current.nextDate(after: date,
matching: components,
matchingPolicy: .nextTime,
direction: .backward)
输出:
date = "Mar 5, 2018 at 1:25 PM"
result = "Mar 5, 2018 at 4:00 AM"
这是黑暗悲伤之路的一个例子,它确实NOT按预期行事:
let components = DateComponents(hour: 4, minute: 0, second: 0)
let date = Calendar.current.date(from: DateComponents(year: 2018,
month: 03,
day: 31,
hour: 13,
minute: 25,
second: 0))!
let result = Calendar.current.nextDate(after: date,
matching: components,
matchingPolicy: .nextTime,
direction: .backward)
输出:
date = "Mar 31, 2018 at 1:25 PM"
result = "Mar 30, 2018 at 4:00 AM"
// it should give me this instead: "Mar 31, 2018 at 4:00 AM"
知道为什么会发生这种情况吗?这是苹果代码中的错误吗,我应该报告吗?或者我用错了?
如果这是苹果的错误,是否有其他方法可以同时实现我所需要的?
Update:
在查看了一些 Swift 源代码后,我注意到问题不在于Calendar.nextDate()
具体发挥作用。nextDate()
uses Calendar.enumerateDates()
这就是真正的问题所在。但我找不到该函数的源代码。
这是使用相同的错误Calendar.enumerateDates()
:
let components = DateComponents(hour: 4, minute: 0, second: 0)
let date = Calendar.current.date(from: DateComponents(year: 2018,
month: 03,
day: 31,
hour: 13,
minute: 25,
second: 0))!
Calendar.current.enumerateDates(startingAfter: inputDate,
matching: components,
matchingPolicy: .nextTime,
direction: .backward) { (date, exactMatch, stop) in
let result = date
// result = "Mar 30, 2018 at 4:00 AM"
stop = true
}
另外,这是一个类似的问题:从二月开始时,Swift 的 Calendar.enumerateDates 给出了错误的结果