我使用swift 3 for osx。 我有这个日历:
此日历应显示实际日期加上14天。 一般来说这是正确的,因为30 - 16 = 14天之间。
这是我的代码:
datePicker.dateValue = Calendar.current.date(byAdding: .day, value: 14, to: Date())!
但是在我日历的底部应该可以看到从现在到所选日期之间的天数。但这里将显示13天。
为什么13而不是14?
此文本标签将按如下方式计算:
txtDiffDays.stringValue = "(\(Calendar.current.dateComponents([.day], from: Date(), to: datePicker.dateValue).day!) Tage)"
我的错误在哪里?
答案 0 :(得分:2)
问题在于您要拨打Date()
两次。
计算差异时,from date
必须与设置datePicker时使用的完全相同。否则会稍晚一些,天数不到14天。
答案 1 :(得分:1)
以下是我在操场上做的一些实验:
let now = Date()
let date = Calendar.current.date(byAdding: .day, value: 14, to: Date())!
let nowDay = Calendar.current.dateComponents([.day], from: Date()).day
let dateDay = Calendar.current.dateComponents([.day], from: date).day
date.timeIntervalSince1970 - Date().timeIntervalSince1970
date.timeIntervalSince1970 - now.timeIntervalSince1970
let days = Calendar.current.dateComponents([.day], from: Date().addingTimeInterval(-1), to: date).day!
let days2 = Calendar.current.dateComponents([.day], from: now, to: date).day!
根据结果,我认为发生的事情是“设置日期选择器的值”和“计算日期差异”之间已经过了一段时间。在这两个操作中,您执行了Date()
。由于已经过了一段时间,他第二次Date()
创建的日期比第一次Date()
调用创建的日期稍晚一点,正如您可以在操场上的第8行和第9行看到的那样。
由于第二个日期稍晚,这使得日期差异少于14天,因此dateComponents
方法将其舍入并且得到13。
要解决此问题,请避免进行两次Date()
次呼叫。您可以创建一个名为now
的局部变量,并在整个方法中使用它。
let now = Date()
或者,你可以像我在游乐场10号线那样使用Date().addingTimeInterval(-1)
,但我觉得这不仅仅是一个骗局。