【问题标题】:Convert seconds to hours, minutes, seconds using NSNumberFormatter使用 NSNumberFormatter 将秒转换为小时、分钟、秒
【发布时间】:2015-12-23 16:00:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios objective-c time nsnumberformatter ios-charts


    【解决方案1】:

    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!
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      关键是,你必须知道你想如何翻译这个数字。例如如果 yAxis 标签上的 '60' 真的意味着 '60 sec',否则你的图表毫无意义。

      【讨论】:

      • 太棒了。谢谢@Wingzero。我把数学记下来了,我只是不知道如何将格式设置到图表中,但是使用你提到的方法的NSNumberFormatter 的简单子类非常有用。我在leftAxis 和LineChartDataSet 上都设置了格式化程序,它很有魅力。
      • 太好了,我忘了提到数据集格式化程序,很高兴你找到它
      【解决方案3】:

      NSNumberFormatter 不适合这个。你可以硬塞一个NSDateFormatter 来做你想做的事,但它们是为显示一天中的日期和时间而设计的,而不是你想要的经过的时间。

      看看这个关于 SO 主题的帖子:

      Formatting seconds into hh:ii:ss

      特别是@dreamlax 答案。

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

      【讨论】:

        猜你喜欢
        • 2021-10-29
        • 1970-01-01
        • 1970-01-01
        • 2012-06-15
        • 2015-06-02
        • 2011-09-01
        • 1970-01-01
        相关资源
        最近更新 更多