dateComponents(_, from, to) 返回错误数据直到 Picker 被触及

dateComponents(_, from, to) returning wrong data until Picker touched

我有 2 个 DatePickers,用户可以在其中 select 小时和分钟。

一旦更改了选择器,就会调用 "calcDuration"-函数,该函数应该计算时间差并以小时和分钟为单位显示在标签上。

basic storyboard setup

    func calcDuration()  {

    
    let diffComponents = Calendar.current.dateComponents([.minute, .hour], from: datePicker1.date, to: datePicker2.date)
    
    let hours = diffComponents.hour!
    let minutes = diffComponents.minute!


    durationLabel.text = "Δ \(hours)h : \(minutes)m"
}

如果我 运行 应用程序并在较低的 datePicker (datePicker2) 中将分钟数增加一分钟,结果为“let minutes = diffComponents.minute!”仍为零。

Debugger-Result showing 0 minutes after DatePicker2 is changed by 1min

如果我进一步增加它,它总是会比实际时间少显示一分钟。

示例:

选择器 1:20:30 选择器 2:20:31 -> 计算出的差异:0 分钟

选择器 1:20:30 选择器 2:20:32 -> 计算的差异:1 分钟

选择器 1:20:30 选择器 2:20:41 -> 计算出的差异:10 分钟

如果我减少较低的 DatePicker (datePicker2) 的分钟数,则一切正常,并且正确显示分钟数差异。 当我将 datePicker2 的小时数增加 1 时效果相同 -> 结果为 59 分钟,如果我将其减少 1 小时则为正确 (-1h)。

示例:

选择器 1:20:30 选择器 2:20:29 -> 计算出的差异:-1 分钟

选择器 1:20:30 选择器 2:20:20 -> 计算出的差异:-10 分钟

解决它的唯一方法是移动上面的 DatePicker (datePicker1)。无论我移动 datePicker1 的小时数还是分钟数,之后一切正常。因此,如果我启动应用程序,将 datePicker1 的小时数增加 1 小时,然后将其减少 1 小时,最后更改 datePicker2,一切正常且计算正确。

我正在使用 iOS 14.5 / Xcode 12.5。

感谢您的帮助!!

编辑:

  1. 如果我在向 datePicker2 添加一分钟后查看秒数,则相差 59 秒:

  1. 如果我查看 Dates() 对象,它们看起来很好:

问题是内部初始选择器日期彼此之间非常轻微不同。这会导致一个“问题”,对您来说表现为舍入误差。

解决方案是将选取器日期设置为完全相同的日期。这是一种方法。在 viewDidLoad 中,这样说:

let now = Date(timeIntervalSince1970: Double(Int(Date().timeIntervalSince1970)))
picker1.date = now
picker2.date = now

这消除了舍入误差,现在选择器的行为符合您的预期。

或者,如果您自己在代码中设置选择器时间,请执行相同的操作。消除舍入误差,以便您最初为两个选择器分配完全相同的值。

要点是,无论如何,选择器日期之间的差异应该仅为整数值。