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

Swift中如何记录计时器的开始与结束时间?

解决你的基础计时器问题

嘿,我来帮你排查这个计时器的问题~你现在遇到的核心bug是:那些时间变量(hourTime、minutesTime)只在App初始化的时候被赋值了一次,之后不管过多久,它们的值都不会更新,所以点击开始和结束按钮时,用的都是启动App那一刻的分钟数,自然算不出正确的时长。

我给你两种解决方案,优先推荐第一种更精准的实现方式:

方案一:用Date对象记录时间差(推荐)

这种方式直接记录时间点,能完美处理跨小时、甚至跨天的计时场景,计算精度也更高:

// 用可选类型记录开始时间,默认nil表示还未开始计时
var startTime: Date?

@IBAction func startTime(_ sender: Any) {
    // 点击开始按钮时,记录当前的准确时间
    startTime = Date()
}

@IBAction func endTime(_ sender: Any) {
    // 先判断用户是否已经点击过开始按钮
    guard let start = startTime else {
        let alert = UIAlertController(title: "提示", message: "请先点击开始按钮哦!", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default))
        self.present(alert, animated: true)
        return
    }
    
    // 计算从开始到现在的时间差(单位:秒)
    let timeInterval = Date().timeIntervalSince(start)
    // 转换成分钟,保留1位小数让结果更直观
    let minutesGone = timeInterval / 60
    
    // 弹出结果提示
    let alert = UIAlertController(title: "计时结束", message: "你的计时器运行了 \(String(format: "%.1f", minutesGone)) 分钟!", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "确定", style: .default))
    self.present(alert, animated: true)
    
    // 重置开始时间,方便下次重新计时
    startTime = nil
}

方案二:基于分钟数计算(仅适合短时间计时)

如果你坚持想用拆分分钟的方式,那必须在点击按钮时重新获取当前时间,同时还要处理跨小时的特殊情况:

// 记录开始时的分钟数,可选类型避免未开始就点击结束
var startMinutes: Int?

@IBAction func startTime(_ sender: Any) {
    // 点击开始时才获取当前分钟数
    let calendar = Calendar.current
    startMinutes = calendar.component(.minute, from: Date())
}

@IBAction func endTime(_ sender: Any) {
    guard let startMin = startMinutes else {
        let alert = UIAlertController(title: "提示", message: "请先点击开始按钮哦!", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default))
        self.present(alert, animated: true)
        return
    }
    
    // 点击结束时再获取一次当前分钟数
    let calendar = Calendar.current
    let currentMin = calendar.component(.minute, from: Date())
    
    // 处理跨小时的情况:比如开始是59分,结束是2分,实际时长是3分钟
    let minutesGone = currentMin >= startMin ? currentMin - startMin : (60 - startMin) + currentMin
    
    // 弹出结果
    let alert = UIAlertController(title: "计时结束", message: "你的计时器运行了 \(minutesGone) 分钟!", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "确定", style: .default))
    self.present(alert, animated: true)
    
    // 重置记录,方便下次使用
    startMinutes = nil
}

小提醒

方案二只适合短时间内的计时(比如不超过1小时),如果计时可能跨小时甚至更久,一定要用方案一的Date时间差方式,避免计算出错~

内容的提问来源于stack exchange,提问作者LachlanMx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:13:06