我和swift 3一起为osx工作。
我有这个日历:
swift - 实际日期加上14天-LMLPHP
这个日历应该显示实际日期加上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)"

我的错误在哪里?

最佳答案

下面是我在操场上做的一些实验:
swift - 实际日期加上14天-LMLPHP

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()。因为一段时间过去了,他第二次创建的日期比第一次调用创建的日期稍晚一点,从操场上的第8行和第9行可以看到。
由于第二个日期稍晚,这使得日期差小于14整天,所以Date()方法将其舍入,得到13。
要解决这个问题,请避免打两个Date()电话。您可以创建一个名为dateComponents的局部变量,并在整个方法中使用它。
let now = Date()

或者,你可以像我在操场10号线那样使用Date(),但我觉得这是一个欺骗而不是解决方案。

07-24 17:45
查看更多