[英]Calculating the number of days between two dates in swift
为什么在计算两个日期之间的天数时使用变量 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
它与您创建变量并比较它们的顺序有关。
你要做的第一件事就是创造today
。 然后,您基于新的Date()
创建twoWeeksFromNow
,该日期将在未来比today
稍远。 在我的机器上,在操场上,第二个日期比第一个日期晚大约 300 微秒。
然后,对于numDaysWithDate
,您将twoWeeksFromNow
与另一个new Date()
进行比较,在未来会更轻微。 因此,您的时间框架略少于 2 周,给您 13 天。
但是,对于numDaysWithToday
,您将twoWeeksFromNow
与在twoWeeksFromNow
之前创建的原始today
进行比较,使其略长于 2 周,给您 14 天。
如果您更改today
和twoWeeksFromNow
声明的顺序,您会看到不同的结果:
var twoWeeksFromNow: Date = Calendar.current.date(byAdding: .day,
value: 14, to: Date())!
var today = Date()
现在,因为today
的创建日期略晚于twoWeeksFromNow
的创建日期,所以两个结果都是 13。
要理解的关键可以归结为这一点。 以下代码:
var today = Date()
print("Woof")
print(Date().timeIntervalSinceReferenceDate - today.timeIntervalSinceReferenceDate )
记录一个大于 0 的值。在我的机器上,它显示的值是0.00047898292541503906
。
这是因为第二个Date()
的值是在today
捕获之后捕获的。 通过添加一个打印语句,可以使代码减慢到足以使两个值相隔超过 4 毫秒。 通过删除打印语句,两个 Date() 值之间的间隔小于 2 毫秒。
如果您进行一系列日历/日期计算并每次都取一个新的Date()
值,那么新的Date
将比您在代码开头捕获的“今天”值晚一小部分时间。 正如@jnpdx 在他们出色的答案中所解释的那样,差异足以让您计算天数。 (已投票)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.