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

如何计算两个日期的分钟差(忽略秒数差异)

解决Swift中计算日期所属分钟区间的差值问题

你的需求本质是计算两个日期所属分钟刻度的间隔数,而非实际秒数换算的分钟数。核心思路是先把两个日期都截断到对应的整点分钟(即把秒、纳秒置为0),再计算这两个截断后日期的分钟差。

实现代码

import Foundation

/// 将日期截断到分钟级别(秒、纳秒置为0)
func truncateToMinute(_ date: Date) -> Date {
    let calendar = Calendar.current
    let components = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: date)
    return calendar.date(from: components)!
}

// 测试用例
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = TimeZone(identifier: "UTC") // 建议指定时区,避免本地时区影响

guard let startDate1 = dateFormatter.date(from: "2023-04-17 13:42:00"),
      let endDate = dateFormatter.date(from: "2023-04-17 13:43:00"),
      let startDate2 = dateFormatter.date(from: "2023-04-17 13:42:58") else {
    fatalError("日期解析失败")
}

// 计算第一个测试用例的差值
let truncatedStart1 = truncateToMinute(startDate1)
let truncatedEnd = truncateToMinute(endDate)
let components1 = Calendar.current.dateComponents([.minute], from: truncatedStart1, to: truncatedEnd)
print(components1.minute ?? 0) // 输出:1

// 计算第二个测试用例的差值
let truncatedStart2 = truncateToMinute(startDate2)
let components2 = Calendar.current.dateComponents([.minute], from: truncatedStart2, to: truncatedEnd)
print(components2.minute ?? 0) // 输出:1

方案说明

  • 截断操作会把任意日期的秒、纳秒清零,只保留到分钟级别的时间点。比如2023-04-17 13:42:58会被转为2023-04-17 13:42:00,和2023-04-17 13:43:00的截断后日期差正好是1分钟。
  • 使用Calendar的dateComponents计算差值,会自动处理跨天、跨月、跨年的情况,不需要手动计算周期差异。

原代码问题分析

  • 第一段代码通过总秒数整除60得到分钟数,只有当秒差≥60时才会返回非0值,无法识别跨分钟但秒数不足的情况。
  • 第二段代码直接计算原始日期的分钟差,Calendar默认按实际时间间隔的分钟数计算(即总秒数/60取整),同样会忽略跨分钟的边界情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:15:02