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。
感谢您的帮助!!
编辑:
- 如果我在向 datePicker2 添加一分钟后查看秒数,则相差 59 秒:
- 如果我查看 Dates() 对象,它们看起来很好:
问题是内部初始选择器日期彼此之间非常轻微不同。这会导致一个“问题”,对您来说表现为舍入误差。
解决方案是将选取器日期设置为完全相同的日期。这是一种方法。在 viewDidLoad
中,这样说:
let now = Date(timeIntervalSince1970: Double(Int(Date().timeIntervalSince1970)))
picker1.date = now
picker2.date = now
这消除了舍入误差,现在选择器的行为符合您的预期。
或者,如果您自己在代码中设置选择器时间,请执行相同的操作。消除舍入误差,以便您最初为两个选择器分配完全相同的值。
要点是,无论如何,选择器日期之间的差异应该仅为整数值。
我有 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。
感谢您的帮助!!
编辑:
- 如果我在向 datePicker2 添加一分钟后查看秒数,则相差 59 秒:
- 如果我查看 Dates() 对象,它们看起来很好:
问题是内部初始选择器日期彼此之间非常轻微不同。这会导致一个“问题”,对您来说表现为舍入误差。
解决方案是将选取器日期设置为完全相同的日期。这是一种方法。在 viewDidLoad
中,这样说:
let now = Date(timeIntervalSince1970: Double(Int(Date().timeIntervalSince1970)))
picker1.date = now
picker2.date = now
这消除了舍入误差,现在选择器的行为符合您的预期。
或者,如果您自己在代码中设置选择器时间,请执行相同的操作。消除舍入误差,以便您最初为两个选择器分配完全相同的值。
要点是,无论如何,选择器日期之间的差异应该仅为整数值。