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 被触摸的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的 DateComponents 返回奇怪的值。为啥?
从 String 创建 DateComponents / NSDateComponents,反之亦然