Swift:如何将时间转为整数计算差值后再转回时间格式?
解决时间计算与存储的正确姿势
你确实把问题复杂化了!根本不需要折腾字符串转整数这一套,直接用时间戳存储和计算才是最简单准确的方案,同时也能轻松实现不带AM/PM的时间显示。
步骤1:获取时间的正确方式
- 如果是用于显示(不带AM/PM):直接给
DateFormatter设置指定格式,跳过系统的.long样式,从根源避免出现AM/PM - 如果是用于存储和计算:直接获取时间戳(自1970年以来的秒数,是整数类型,完美适配UserDefaults)
代码示例:
// 获取用于显示的无AM/PM时间字符串(24小时制用"HH:mm",12小时制用"h:mm") func getDisplayTime() -> String { let formatter = DateFormatter() formatter.dateFormat = "HH:mm" formatter.locale = Locale(identifier: "en_US_POSIX") // 避免地区设置影响格式 return formatter.string(from: Date()) } // 获取用于存储/计算的时间戳(秒级整数) func getCurrentTimestamp() -> Int { return Int(Date().timeIntervalSince1970) }
步骤2:保存时间到UserDefaults
直接存时间戳(整数),不用存字符串:
// 保存开始时间的时间戳 let startTimeStamp = getCurrentTimestamp() UserDefaults.standard.set(startTimeStamp, forKey: "startTime")
步骤3:计算时间差值并转为"小时:分钟"格式
取出时间戳后直接计算秒数差,再转成需要的格式:
// 取出保存的时间戳,先判空避免崩溃 guard let savedStartTimeStamp = UserDefaults.standard.object(forKey: "startTime") as? Int else { print("未找到保存的开始时间") return } // 计算时间差(单位:秒) let currentTimeStamp = getCurrentTimestamp() let diffSeconds = currentTimeStamp - savedStartTimeStamp // 转换为"小时:分钟"格式 let hours = diffSeconds / 3600 let minutes = (diffSeconds % 3600) / 60 let diffString = String(format: "%02d:%02d", hours, minutes) print(diffString) // 示例输出:"02:15"(2小时15分钟)
为什么你的原方法行不通?
你之前把时间转成字符串后想再转整数,不仅要处理AM/PM的问题,还会丢失日期信息(如果跨天的话计算完全错误)。用时间戳直接计算,既不用处理字符串,还能准确计算任意时长的差值。
内容的提问来源于stack exchange,提问作者Hej-j
相关产品推荐
相关产品推荐

