如何实现DatePicker的今日(当前至当日结束)与次日全时段日期范围?
日期范围实现修正方案
原代码问题分析
- 今日范围:直接给当前时间加1天,得到的是明天的当前时刻,而非当日的结束时刻(比如当前是今日10点,原代码结束时间是明日10点,不符合需求)
- 次日范围:起始时间加了2天,得到的是后天的当前时刻,完全偏离了“次日开始→次日结束”的需求
正确实现代码
今日范围(当前时刻→当日结束)
var todayRange: ClosedRange<Date> { let calendar = Calendar.current let now = Date.now // 获取次日0点的时刻 guard let startOfTomorrow = calendar.date(byAdding: .day, value: 1, to: now).flatMap(calendar.startOfDay(for:)) else { fatalError("Failed to calculate start of tomorrow") } // 当日结束时刻为次日0点前1秒 let endOfToday = startOfTomorrow.addingTimeInterval(-1) return now ... endOfToday }
次日范围(次日开始→次日结束)
var tomorrowRange: ClosedRange<Date> { let calendar = Calendar.current let now = Date.now // 获取次日0点的时刻(范围起始) guard let startOfTomorrow = calendar.date(byAdding: .day, value: 1, to: now).flatMap(calendar.startOfDay(for:)) else { fatalError("Failed to calculate start of tomorrow") } // 获取后天0点的时刻,减去1秒得到次日结束时刻 guard let startOfDayAfterTomorrow = calendar.date(byAdding: .day, value: 2, to: now).flatMap(calendar.startOfDay(for:)) else { fatalError("Failed to calculate start of day after tomorrow") } let endOfTomorrow = startOfDayAfterTomorrow.addingTimeInterval(-1) return startOfTomorrow ... endOfTomorrow }
代码说明
- 今日范围:以当前时刻为起点,通过
Calendar.startOfDay(for:)获取次日的起始时刻,再减去1秒得到当日的最后一刻,确保覆盖当天所有剩余时间 - 次日范围:以次日0点为起始,后天0点前1秒为结束,完整覆盖次日的全天时间
- 加入
guard let做可选值绑定,避免强制解包的崩溃风险,代码更健壮
内容的提问来源于stack exchange,提问作者Alisher Baigazin
相关产品推荐
相关产品推荐

