使用 NSNumberFormatter 将秒转换为小时、分钟、秒

Convert seconds to hours, minutes, seconds using NSNumberFormatter

我正在使用图表框架,因此我可以显示统计数据,它采用简单的数值,例如 1、5、17、99、1,574 等,并将它们绘制在图表上。

它提供了设置 NSNumberFormatter 以更优雅地显示这些值的选择。

我使用的数字是总秒数。例如。 660秒,1080秒。

如何使用 NSNumberFormatter 让我的数字显示为小时、分钟、秒,而不是纯粹的总秒数?

NSNumberFormatter 不太适合这个。你可以强行 NSDateFormatter 做你想做的事,但这些设计是为了显示日期和一天中的时间,而不是你想要的经过时间。

看看关于这个主题的 SO 线程:

Formatting seconds into hh:ii:ss

特别是@dreamlax 的回答。

如果您不需要支持自动本地化,这是最简单的方法。

如果您谈论的是 xAxis 标签,它们是字符串,而不是数字,因此您可以直接将日期字符串传递给 xAxis 值。

如果您在谈论 y 轴标签,因为您知道 y 轴代表数字,这就是我们可以绘制图表的原因。

如果你真的想这样做,你可以编写自己的 NSNumberFormatter 子类并覆盖 stringFromNumber,以手动将数字转换为你想要的时间。并将此格式化程序用于 yAxis.valueFormatter.

这是简单的数学运算,您只需将 60/3600 除以得到分钟或小时。

重点是,您必须知道要如何翻译号码。例如如果 yAxis 标签上的“60”真的意味着“60 秒”,否则你的图表就没有意义。

DateComponentsFormatter,可从 iOS 8 获得,效果很好,特别是如果您想要简单的本地化。这里有些例子。

let duration : TimeInterval = 11735    // seconds
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]

formatter.unitsStyle = .abbreviated
let text1 = formatter.string(from: duration)     // "3h 15m 35s"

// choose a longer unit style:
formatter.unitsStyle = .short
let text2 = formatter.string(from: duration)     // "3 hr, 15 min, 35 sec"

// easy localization:
formatter.calendar?.locale = Locale(identifier: "da_DK")
let text3 = formatter.string(from: duration)     // "3 t., 15 min. og 35 sek."

// approximate to whole minutes:
formatter.calendar?.locale = Locale(identifier: "en_US")
formatter.includesApproximationPhrase = true
formatter.allowedUnits = [.hour, .minute]
let text4 = formatter.string(from: duration)     // "About 3 hr, 15 min" - (not rounding up)

// approximation AND localization (Apple has a bug to fix):
formatter.calendar?.locale = Locale(identifier: "da_DK")
formatter.includesApproximationPhrase = true
formatter.allowedUnits = [.hour, .minute]
let text5 = formatter.string(from: duration)     // "About 3 t. og 15 min." - Ugh!