NSDateComponentsFormatter省略了单位。为什么?

时间:2016-03-04 15:58:04

标签: swift cocoa 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天,而实际上并非如此。

2 个答案:

答案 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。

对于某些日期组件,我得到了错误的值,这不是一个舍入问题。

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

Getting screwy results from NSDateComponentsFormatter