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

问题描述 投票:2回答:3

我正在使用Charts框架,因此我可以显示统计信息,并采用简单的数字值,例如1、5、17、99、1,574等,并将其绘制在图形上。

它可以选择设置NSNumberFormatter以便更优雅地显示这些值。

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

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

ios objective-c time nsnumberformatter ios-charts
3个回答
4
投票

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

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

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

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

重点是,您必须知道如何转换号码。例如如果yAxis标签上的“ 60”确实是“ 60秒”,则您的图表没有意义。


3
投票

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!

1
投票

NSNumberFormatter确实不适合这样做。您可以根据需要选择NSDateFormatter,但这些显示用于显示日期和时间,而不是您想要的经过时间。

在主题上看一下关于SO的这个线程:

Formatting seconds into hh:ii:ss

特别是@dreamlax的答案。

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

© www.soinside.com 2019 - 2024. All rights reserved.