我正在尝试使用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天,而实际上并非如此。
答案 0 :(得分:4)
请注意,2016年3月27日,许多国家/地区的夏令时发生了变化。
绝对时间间隔可能与基于日历单位的日历计算不同。
尽可能避免使用文字数字进行日期数学计算。
关于
的NSDateComponentsFormatter
属性calendar
文档格式化程序使用此属性中的日历来格式化没有自己的固有日历的值。 例如,格式化程序在格式化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
答案 1 :(得分:2)
基于我所做的有限测试,NSDateComponentsFormatter在iOS版本中是错误的< iOS 9和Mac OS< 10.11。
对于某些日期组件,我得到了错误的值,这不是一个舍入问题。
在此链接中查看我的问题: