【问题标题】:actual date plus 14 days实际日期加上 14 天
【发布时间】:2017-08-16 14:22:51
【问题描述】:

我使用 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)"

我的错误在哪里?

【问题讨论】:

  • 令人惊讶的是,如果您使用let now = Date() 并将Date() 替换为now,它会起作用。

标签: swift macos cocoa datepicker


【解决方案1】:

问题是您调用了两次Date()

计算差值时,from date 必须与设置 datePicker 时使用的日期完全相同。否则稍晚,天数少于 14 天。

【讨论】:

    【解决方案2】:

    以下是我在操场上进行的一些实验:

    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),但我觉得这是一个作弊而不是解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      相关资源
      最近更新 更多