NSDateComponentsFormatter省略了单位.为什么



我正在尝试使用NSDateComponentsFormatter生成用户可读的持续时间字符串。虽然它通常运行良好,但有时结果很奇怪(或者完全错误):

// 22d 23h 15m 34.123s
let timeInterval: NSTimeInterval = 34.123 + 60.0 * (15.0 + 60.0 * (23.0 + 24.0 * 22.0))
let formatter = NSDateComponentsFormatter()
formatter.allowedUnits = [NSCalendarUnit.Year, NSCalendarUnit.Day, NSCalendarUnit.Hour, NSCalendarUnit.Minute, NSCalendarUnit.Second]
formatter.maximumUnitCount = 2
formatter.unitsStyle = .Abbreviated
formatter.zeroFormattingBehavior = .Default
// expected result:     22d 23h
// actual result:       23d 16m
let result = formatter.stringFromTimeInterval(timeInterval)

在此示例中,它不仅省略了小时字段,而且还舍入了天数分钟数。我假设一旦四舍五入天数,它应该"用完"四舍五入中的剩余分钟数。从结果来看,用户会认为持续时间肯定超过 23 天,而实际上并非如此。

考虑到 2016 年 3 月 27 日,许多国家/地区的夏令时发生了变化。

绝对时间间隔可能与基于日历单位的日历计算不同。

尽可能避免使用文字数字的日期数学。

来自有关其calendar属性的NSDateComponentsFormatter文件

格式化

程序使用此属性中的日历来格式化没有自己的固有日历的值。例如,格式化程序在格式化 NSTimeInterval 值时使用此日历

更新:

另请参阅此示例,它创建一个日期 2016 年 3 月 27 日,通过日期组件添加一天并计算间隔

let calendar = NSCalendar.currentCalendar()
let startDate = calendar.dateWithEra(1, year: 2016, month: 3, day: 27, hour: 0, minute: 0, second: 0, nanosecond: 0)!
let endDate = calendar.dateByAddingUnit(.Day, value: 1, toDate: startDate, options: [])!
let formatter = NSDateComponentsFormatter()
formatter.allowedUnits = [.Hour, .Minute, .Second]
formatter.unitsStyle = .Abbreviated
let result = formatter.stringFromDate(startDate, toDate: endDate)
print(result) // 23h

基于我所做的有限测试,NSDateComponentsFormatter在iOS 9<和Mac OS="><10.11中存在错误。>

我得到了一些日期组件的错误值,这不是四舍五入的问题。

在此链接中查看我的问题:

从 NSDateComponentsFormatter 获得糟糕的结果

最新更新