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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:45:23