如何可靠计算不考虑时间的日期差值 兼容夏令时等特殊场景
可靠的日期天数差计算方案(忽略时间部分)
最严谨且不受夏令时、时区偏移影响的方案是,直接基于年、月、日三个纯日期维度计算差值,完全绕开时间戳长度波动问题,iOS/macOS 平台可通过 Foundation 原生 Calendar 接口实现:
extension Calendar { /// 计算两个日期的天数差,完全忽略时分秒部分 func daysBetweenIgnoringTime(from startDate: Date, to endDate: Date) -> Int { // 仅提取两个日期的年、月、日信息,丢弃所有时间相关字段 let startDateComponents = dateComponents([.year, .month, .day], from: startDate) let endDateComponents = dateComponents([.year, .month, .day], from: endDate) // 直接计算纯日期维度的天数差 return dateComponents([.day], from: startDateComponents, to: endDateComponents).day ?? 0 } }
你可以用你提到的德黑兰夏令时场景验证该方案,最终会得到符合预期的差值1。
常见方案的缺陷说明
startOfDay计算方案:本质还是计算两个时间戳的差值,遇到夏令时切换导致的两日间隔不足24小时的场景,就会被判定为不足1天,得到错误结果。- 正午12点计算方案:依赖当前全球所有地区都不会在正午切换夏令时的默认规则,不是严谨的逻辑解法,存在未来规则调整后失效的风险。
内容的提问来源于stack exchange,提问作者Cheok Yan Cheng
相关产品推荐
相关产品推荐

