DateComponentsFormatter不使用过去的日期

时间:2017-07-15 14:51:50

标签: ios swift nsdateformatter nsdatecomponentsformatter

我使用内置的DateComponentsFormatter来计算当天和另一个日期之间的年数。如果过去的日期过去太远,例如1940年,则返回的单位是错误的:

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的bug吗?我做错了吗?

1 个答案:

答案 0 :(得分: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)