gpt4 book ai didi

swift - NSDateComponentsFormatter 省略了单位。为什么?

转载 作者:搜寻专家 更新时间:2023-11-01 05:57:28 25 4
gpt4 key购买 nike

我正在尝试使用 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 日,许多国家/地区的夏令时发生了变化。

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

尽可能避免使用文字数字进行日期计算。

From the NSDateComponentsFormatter documentation regarding its calendar property

The formatter uses the calendar in this property to format values that do not have an inherent calendar of their own. For example, the formatter uses this calendar when formatting an NSTimeInterval value.

更新:

另请参阅此示例,它创建了一个日期 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

关于swift - NSDateComponentsFormatter 省略了单位。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35800420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com