2017-07-15 90 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) 
相关问题