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
相关产品推荐
相关产品推荐

