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

在swift中计算两个日期之间的天数,swift,date,variables,Swift,Date,Variables,为什么在计算两个日期之间的天数时使用变量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:

为什么在计算两个日期之间的天数时使用变量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

这与创建变量和比较变量的顺序有关

您要做的第一件事就是今天创建
。然后,基于一个新的
日期()
,从现在开始创建
twoWeeksFromNow
,该日期在未来将比今天的
稍微远一点。在我的机器上,在操场上,第二次约会比第一次要晚300微秒

然后,对于
numDaysWithDate
,您将
从现在开始的两周
与另一个新的
Date()
进行比较,甚至在将来更轻微。所以,你的时间范围是非常略少于2个完整的星期,给你13天

但是,对于今天的
numDaysWithToday
,您将
TwoweekFromNow
与原始的
today
进行比较,原始的
TwoweekFromNow
是在
TwoweekFromNow
之前创建的,使其略长于2周,给您14天的时间

若您更改了
today
twoWeeksFromNow
声明的顺序,您可以看到不同的结果:

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

现在,因为今天创建的
比创建
TwoweekFromNow
的日期稍晚,所以两个结果都是13。

这与创建变量和比较变量的顺序有关

您要做的第一件事就是今天创建
。然后,基于一个新的
日期()
,从现在开始创建
twoWeeksFromNow
,该日期在未来将比今天的
稍微远一点。在我的机器上,在操场上,第二次约会比第一次要晚300微秒

然后,对于
numDaysWithDate
,您将
从现在开始的两周
与另一个新的
Date()
进行比较,甚至在将来更轻微。所以,你的时间范围是非常略少于2个完整的星期,给你13天

但是,对于今天的
numDaysWithToday
,您将
TwoweekFromNow
与原始的
today
进行比较,原始的
TwoweekFromNow
是在
TwoweekFromNow
之前创建的,使其略长于2周,给您14天的时间

若您更改了
today
twoWeeksFromNow
声明的顺序,您可以看到不同的结果:

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

现在,由于
今天
的创建日期略晚于
TwoweekFromNow
创建日期,因此两个结果都是13。

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

var today = Date()
print("Woof")
print(Date().timeIntervalSinceReferenceDate - today.timeIntervalSinceReferenceDate )
记录大于0的值。在我的机器上,它显示的值为
0.00047898292541503906

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


如果您进行一系列日历/日期计算,每次都取一个新值
Date()
,则新的
Date
将比您在代码开头捕获的“今日”值晚一小部分秒。正如@jnpdx在其出色的答案中所解释的那样,这一差异足以抵消您的天数计算。(投票)

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

var today = Date()
print("Woof")
print(Date().timeIntervalSinceReferenceDate - today.timeIntervalSinceReferenceDate )
记录大于0的值。在我的机器上,它显示的值为
0.00047898292541503906

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


如果您进行一系列日历/日期计算,每次都取一个新值
Date()
,则新的
Date
将比您在代码开头捕获的“今日”值晚一小部分秒。正如@jnpdx在其出色的答案中所解释的那样,这一差异足以抵消您的天数计算。(投票)

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