2017-07-15 86 views
2

我使用內置的DateComponentsFormatter來計算當前日期和另一日期之間的年數。如果過去的日期,例如1940年得到太遠,返回的單位是錯誤的:DateComponentsFormatter不適用於過去的日期

let dateComponents = DateComponents(year: 1940, month: 1, day: 2, hour: 1, minute: 1, second: 1) 

let date = Calendar.current.date(from: dateComponents)! 

let dateComponentsFormatter = DateComponentsFormatter() 
dateComponentsFormatter.allowedUnits = [.year] 
dateComponentsFormatter.unitsStyle = .full 

print(dateComponentsFormatter.string(from: abs(date.timeIntervalSinceNow))) 

這將打印-58 years這是不正確。這是Apple的錯誤嗎?難道我做錯了什麼?

+0

'打印(dateComponentsFormatter.string(來源:日期,以:日期())?? 「」)' –

+0

@LeoDabus感謝我還曾試圖哪個更好,但並不總是給出相同的價值...有時70年,有時69年 – Stephen

+0

它給了我77年 –

回答

2

這是DateComponentsFormatter的實現中的一個bug。 他們顯然在內部使用Int32來表示時間間隔。

我碰到了同樣的問題,這是非常容易重現:

let interval: TimeInterval = ... some number here 
let formatter = DateComponentsFormatter() 
formatter.allowedUnits = [.second] 
formatter.unitsStyle = .abbreviated 
print(formatter.string(from: interval) ?? "") 

這應該是隻輸出的秒數,沒有任何特殊的計算。 即使這樣,直到2147483647(這恰好是Int32.max)只能按預期工作。這一切都只是溢出併產生不正確的結果。

這個最大的「支持」秒數是68y 2w 4d 3h 14m 7s,這也解釋了你爲什麼看到它。

UPD

有人已經提出了雷達:http://www.openradar.me/32513237,並提到一個解決方法那裏,和它的作品!

在你的情況,將被代替使用:

let date = Calendar.current.date(from: dateComponents)! 
let now = Date() 
dateComponentsFormatter.string(from: date, to: now) 
相關問題