[英]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.