Swift时间运算技术问询:如何实现时间的加减操作
解决Swift中时间加减运算的问题
嘿,看来你已经搞定了上午工作时长的计算,接下来的剩余时长推导和结束时间计算其实只要理清逻辑,用Calendar和DateComponents就能轻松搞定!我给你一步步拆解:
核心逻辑梳理
我们要完成两个关键步骤:
- 从应工作时长中减去上午已工作时长,得到剩余需要工作的时长
- 把剩余时长加到下午开始时间上,得到最终的当日结束时间
具体实现代码
结合你已经写出的上午时长计算代码,我们继续往下完善:
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. 计算当日结束时间
用Calendar的date(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




