Swift中Calendar设置小时为0时日期计算异常问题问询
问题原因分析
首先,你遇到的这个问题是因为Calendar.date(bySetting:of:)方法的默认匹配策略导致的。这个方法的默认行为是寻找下一个符合设置的时间点,而不是回溯到过去的最近匹配点。
当你当前时间是上午11点时,调用date(bySetting: .hour, value: 0, of: date),系统会认为“下一个小时为0的时间点”是第二天的午夜,而不是当天已经过去的午夜。这就导致midnight的时间在当前date之后,所以midnight.timeIntervalSince(date)计算出来的是正数(约13小时,因为11点到第二天0点是13小时),和你预期的负11小时(当天0点到11点的间隔)相反。
解决办法
要让方法回溯到过去的最近匹配时间,你需要使用带matchingPolicy参数的重载方法date(bySetting:value:of:matchingPolicy:),指定匹配策略为.backwards,这样系统会从当前时间往回找最近的符合条件的时间点。
修正后的代码如下:
let date = Date() // 指定匹配策略为 .backwards,往过去找最近的0点 let midnight = Calendar.current.date(bySetting: .hour, value: 0, of: date, matchingPolicy: .backwards)! let difference = Int64(midnight.timeIntervalSince(date)) print(String(difference))
这段代码会正确得到当天的午夜时间,计算出来的difference会是-11小时对应的秒数(因为当前时间是上午11点,当天0点在当前时间之前,时间间隔为负数)。
另外额外提醒:如果你的场景需要处理时区或者特殊日历(比如夏令时切换),建议同时指定timeZone参数确保结果的准确性,但对于一般本地时间场景,上面的代码已经足够解决问题。
内容的提问来源于stack exchange,提问作者kmell96
相关产品推荐
相关产品推荐

