我有两个DatePickers,用户可以选择小时和分钟。
一旦选择器被更改,就会调用"calcDuration"-function来计算时间差,并在几小时和分钟内在标签上显示它。
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!”仍然是零。
调试器-在DatePicker2更改1分钟后显示0分钟的结果
如果我再加一点,它总是比实际的差少一分钟。
示例:
选择器1: 20:30选择器2: 20:31 ->计算差:0分钟
拾取器1: 20:30 ->计算差:1分钟
选择器1: 20:30选择器2: 20:41 ->计算差10分钟
如果我减少了较低的DatePicker (datePicker2)的分钟数,那么一切都会正常工作,并且以分钟为单位的差异将被正确显示。当datePicker2小时增加1 ->时,同样的效果是59分钟,如果减少1小时,它是正确的(-1小时)。
示例:
采摘器1: 20:30 ->计算差2: 20:29 -1分钟
选择1: 20:30选择器2: 20:20 :20 ->计算差:-10分钟
解决这个问题的唯一方法是移动上面的DatePicker (datePicker1)。不管我是否移动了datePicker1的时间或分钟,之后一切都很好。因此,如果我启动应用程序,将datePicker1的时间增加1小时,然后将它减少1小时,最后更改datePicker2,一切都很好,计算正确。
我正在使用iOS 14.5 / Xcode 12.5。
谢谢你的帮助!!
编辑:


发布于 2021-05-31 00:23:42
问题是,内部初始选择日期之间有很小的不同。这导致了一个“问题”,对您来说,这是一个舍入错误。
解决方案是将选择日期设置为完全相同的日期。这里有个办法。在viewDidLoad中,可以这样说:
let now = Date(timeIntervalSince1970: Double(Int(Date().timeIntervalSince1970)))
picker1.date = now
picker2.date = now这样就消除了舍入错误,现在选择器的行为与您所期望的一样。
或者,如果您要在代码中自己设置选择时间,请执行相同的操作。首先,消除舍入错误,这样您就可以将相同的值分配给这两个选择器。
问题是,无论如何,选择日期之间的差异应该仅限于整数值。
https://stackoverflow.com/questions/67755263
复制相似问题