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

Posted

技术标签:

【中文标题】dateComponents(_, from, to) 返回错误数据,直到 Picker 被触摸【英文标题】:dateComponents(_, from, to) returning wrong data until Picker touched 【发布时间】:2021-08-17 16:04:09 【问题描述】:

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

一旦选择器被更改,"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) 中的分钟数增加一分钟,则“让分钟 = 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 的小时数增加 1h,然后将其减少 1h,最后更改 datePicker2,一切正常且计算正确。

我正在使用 ios 14.5 / Xcode 12.5。

感谢您的帮助!!

编辑:

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

    如果我查看 Dates() 对象,它们看起来不错:

【问题讨论】:

如果除了分钟和小时之外还看秒怎么办? 或者直接看两个日期,看看是怎么回事。 谢谢,检查了两者并在我的问题中添加了一些屏幕截图。日期看起来不错,如果我查看将 Picker 推进 1 分钟后得到 59 秒的秒数。 这就是你的答案!正如我所怀疑的那样。在 59 秒内,分钟部分确实为 0。因此您也需要捕获秒数并向上取整。 谢谢马特!很抱歉问,但我是一个该死的初学者:我怎样才能捕捉/四舍五入?我想如果我在 1 分钟内更改 Picker,它应该使用 Date 对象。根据控制台,它这样做了。它只是 dateComponent(from: to:) 不起作用(返回 59s 而不是 1min)。我感谢任何想法! :) 【参考方案1】:

问题在于内部的初始选择器日期彼此之间非常细微不同。这会导致一个“问题”,对您而言,它表示为舍入误差。

解决方案是将选择器日期设置为相同的日期。这是一个方法。在viewDidLoad,这样说:

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

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

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

关键是,无论哪种方式,选择器日期之间的差异应该只是整数值。

【讨论】:

以上是关于dateComponents(_, from, to) 返回错误数据,直到 Picker 被触摸的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用TimeZone

Swift 中的 DateComponents 返回奇怪的值。为啥?

如何计算两个日期之间的差异?

从 String 创建 DateComponents / NSDateComponents,反之亦然

从 String 创建 DateComponents / NSDateComponents,反之亦然

DateComponents 给出错误的时间