You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:31:03