繁体   English   中英

计算 swift 中两个日期之间的天数

[英]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 天。

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM