2017-07-15 2 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の実装のバグです。 彼らは明らかに時間間隔を表すために内部的に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) 
関連する問題