【问题标题】:NSTimeInterval FormattingNSTimeInterval 格式
【发布时间】:2011-11-14 21:04:03
【问题描述】:

我想获取我的NSTimeInterval 并将其格式化为 00:00:00(小时、分钟、秒)的字符串。最好的方法是什么?

【问题讨论】:

  • 您在NSTimeInterval to NSDate 上接受的答案已经向您展示了如何做到这一点。
  • @JoshCaswell 我知道詹姆斯似乎在四处逛逛,但公平地说,我认为这里接受的答案更好,因为它使用 NSDateFormatter,它处理了所有令人讨厌的细节其他答案难以解决。我赞成。

标签: objective-c ios nstimeinterval


【解决方案1】:

从 iOS 8.0 开始,现在有了 NSDateComponentsFormatter,它有一个 stringFromTimeInterval: 方法。

[[NSDateComponentsFormatter new] stringFromTimeInterval:timeInterval];

【讨论】:

  • 对于较短的时间间隔,值得注意的是,此方法会截断秒数而不是舍入。所以你应该先四舍五入 timeInterval。
【解决方案2】:

“最佳”是主观的。最简单的方法是这样的:

unsigned int seconds = (unsigned int)round(myTimeInterval);
NSString *string = [NSString stringWithFormat:@"%02u:%02u:%02u",
    seconds / 3600, (seconds / 60) % 60, seconds % 60];

更新

从 iOS 8.0 和 Mac OS X 10.10 (Yosemite) 开始,如果您需要符合语言环境的解决方案,可以使用 NSDateComponentsFormatter。示例:

NSTimeInterval interval = 1234.56;
NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
formatter.allowedUnits = NSCalendarUnitHour | NSCalendarUnitMinute |
    NSCalendarUnitSecond;
formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad;
NSString *string = [formatter stringFromTimeInterval:interval];
NSLog(@"%@", string);
// output: 0:20:34

但是,我没有办法强制它在小时内输出两位数,所以如果这对您很重要,您将需要使用不同的解决方案。

【讨论】:

  • 这很棒。但是将“NSUInteger”替换为“unsigned int”会更正确,以匹配“%02u”格式说明符。 “NSUInteger”不是所有硬件和所有 iOS 版本上的“unsigned int”。此修复将消除无害的错误。
【解决方案3】:
NSTimeInterval interval = ...;    
NSDate *date = [NSDate dateWithTimeIntervalSince1970:interval];    
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"HH:mm:ss"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSString *formattedDate = [dateFormatter stringFromDate:date];
NSLog(@"hh:mm:ss %@", formattedDate);

【讨论】:

  • 你能解释一下dateWithTimeIntervalSince1970吗? 1970 年 1 月 1 日有什么意义?我并不怀疑您的代码是否有效(我将尝试一下),我只是好奇为什么。谢谢!
  • @James: 1/1/1970 是Unix Epoch;时间的开始。
  • 仅供参考,供那些发现此问题的人参考,使用提供的代码显示字符串,因为日期将在我当前的时区 (00:00:00 - 05:00:00 [我的时区是 -5] 将显示 19:00:00)。为了解决这个问题,我通过添加 [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; 将日期更改为 UTC
  • 不要使用 dateWithTimeIntervalSince1970:。使用 dateWithTimeIntervalSinceReferenceDate: 代替,因为后者是指定的初始化器并且更准确。
  • 这将错误地将小时持续时间 > 24 小时显示为 hours%24 - 也就是说,持续时间 26 小时 35 分钟将显示为 02:35:00
【解决方案4】:

斯威夫特 4.2

extension Date {
    static func timestampString(timeInterval: TimeInterval) -> String? {
        let formatter = DateComponentsFormatter()
        formatter.unitsStyle = .positional
        formatter.zeroFormattingBehavior = .pad
        formatter.maximumUnitCount = 0
        formatter.allowedUnits = [.hour, .minute, .second]
        return formatter.string(from: timeInterval)
    }
}

测试代码:

let hour = 60 * 50 * 32
Date.timestampString(timeInterval: TimeInterval(hour))

// output "26:40:00"

更改unitStyle 以获得不同的样式。喜欢formatter.unitsStyle = .abbreviatedget

输出:"26h 40m 0s"

【讨论】:

    【解决方案5】:

    @Michael Frederick 答案的 Swift 版本:

    let duration: NSTimeInterval = ...
    let durationDate = NSDate(timeIntervalSince1970: duration)
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "HH:mm:ss"
    dateFormatter.timeZone = NSTimeZone(name: "UTC")
    let durationString = dateFormatter.stringFromDate(durationDate)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多