簡體   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