【问题标题】:Calculating the number of days between two dates in swift快速计算两个日期之间的天数
【发布时间】:2021-08-23 13:20:16
【问题描述】:

为什么在计算两个日期之间的天数时使用变量 today 而不是 Date() 的结果在 swift 中会产生差异?

var numDays: Int
var today = Date()
var twoWeeksFromNow: Date = Calendar.current.date(byAdding: .day, 
value: 14, to: Date())!

var numDaysWithDate: Int = 
Calendar.current.dateComponents([.day], from: Date(), to: 
twoWeeksFromNow).day!
var numDaysWithToday: Int = 
Calendar.current.dateComponents([.day], from: today, to: 
twoWeeksFromNow).day!

print(numDaysWithDate) // 13
print(numDaysWithToday) // 14

【问题讨论】:

  • 请勿发布代码图片。在代码中编辑您的问题和过去。然后选择它并点击代码标签按钮({})进行代码格式化。
  • 我的b,我会改的

标签: swift date variables


【解决方案1】:

要理解的关键可以归结为这一点。以下代码:

var today = Date()
print("Woof")
print(Date().timeIntervalSinceReferenceDate - today.timeIntervalSinceReferenceDate )

记录一个大于 0 的值。在我的机器上,它显示一个值 0.00047898292541503906

这是因为第二个Date()的值是在捕获today之后捕获的。通过添加一个打印语句,可以使代码减慢到足以使两个值相隔超过 4 毫秒。通过删除打印语句,两个 Date() 值之间的间隔小于 2 毫秒。

如果您进行一系列日历/日期计算并且每次都取一个新值Date(),那么新的Date 将比您在开始时捕获的“今天”值晚几分之一秒你的代码。正如@jnpdx 在他们出色的答案中所解释的那样,差异足以让您计算天数。 (已投票)

【讨论】:

    【解决方案2】:

    这与您创建变量并比较它们的顺序有关。

    您要做的第一件事是创建today。然后,您基于新的Date() 创建twoWeeksFromNow,该Date() 在未来将比today 更远。在我的机器上,在操场上,第二个日期比第一个日期晚大约 300 微秒。

    然后,对于numDaysWithDate,您将twoWeeksFromNow另一个新的Date() 进行比较,甚至在未来略微。因此,您的时间框架不到 2 整周,给您 13 天。

    但是,对于numDaysWithToday,您将twoWeeksFromNow 与原始today 进行比较,后者是在之前 twoWeeksFromNow 创建的,使其长于2 周,给你 14 天。

    如果您更改todaytwoWeeksFromNow 声明的顺序,您会看到不同的结果:

    var twoWeeksFromNow: Date = Calendar.current.date(byAdding: .day,
    value: 14, to: Date())!
    var today = Date()
    

    现在,因为 today 的创建日期稍晚于 twoWeeksFromNow 的创建日期,所以两个结果都是 13。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 2019-09-27
      • 1970-01-01
      • 2011-11-08
      相关资源
      最近更新 更多