You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Swift时间运算技术问询:如何实现时间的加减操作

解决Swift中时间加减运算的问题

嘿,看来你已经搞定了上午工作时长的计算,接下来的剩余时长推导和结束时间计算其实只要理清逻辑,用CalendarDateComponents就能轻松搞定!我给你一步步拆解:

核心逻辑梳理

我们要完成两个关键步骤:

  1. 应工作时长中减去上午已工作时长,得到剩余需要工作的时长
  2. 剩余时长加到下午开始时间上,得到最终的当日结束时间

具体实现代码

结合你已经写出的上午时长计算代码,我们继续往下完善:

1. 计算剩余需工作时长

直接操作小时和分钟容易出现借位问题(比如分钟不够减的情况),所以我们可以把时长统一转成总分钟数来计算,再转回DateComponents,这样更稳妥:

// 示例:假设应工作时长是8小时30分钟,你可以根据实际场景替换成你的数据源(比如用户输入、配置常量)
let requiredWorkTime = DateComponents(hour: 8, minute: 30)

// 将应工作时长和上午已工作时长转成总分钟数
let totalRequiredMinutes = (requiredWorkTime.hour ?? 0) * 60 + (requiredWorkTime.minute ?? 0)
let totalMorningMinutes = (diffMorning.hour ?? 0) * 60 + (diffMorning.minute ?? 0)

// 计算剩余总分钟数,再转回小时和分钟的DateComponents
let remainingTotalMinutes = totalRequiredMinutes - totalMorningMinutes
let remainingWorkTime = DateComponents(
    hour: remainingTotalMinutes / 60,
    minute: remainingTotalMinutes % 60
)

2. 计算当日结束时间

Calendardate(byAdding:to:)方法,把剩余时长加到下午开始时间上,最后格式化显示结果:

// 假设你的下午开始时间是tmAfternoonFrom.date(和你上午用的tmMorningFrom同类型,比如UIDatePicker)
if let afternoonStartDate = tmAfternoonFrom.date,
   let dailyEndDate = Calendar.current.date(byAdding: remainingWorkTime, to: afternoonStartDate) {
    // 初始化日期格式化器,按需调整显示格式
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH:mm" // 比如显示"18:30"这样的24小时制格式
    let endTimeString = dateFormatter.string(from: dailyEndDate)
    
    // 更新结果文本,和你之前的上午时长结果拼接
    tmResult.text += "\nDaily end time: \(endTimeString)"
} else {
    // 处理日期无效的异常情况(比如用户未选择有效时间)
    tmResult.text += "\nFailed to calculate daily end time"
}

额外提示

  • 一定要做可选绑定tmAfternoonFrom.date可能为nil,用if let能避免崩溃
  • 如果剩余时长为负数(比如上午工作时间超过了应工作时长),可以根据业务需求添加提示逻辑(比如显示"已超额完成今日工作")

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

火山引擎 最新活动