NSTimeInterval 格式

Posted

技术标签:

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

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

【问题讨论】:

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

【讨论】:

以上是关于NSTimeInterval 格式的主要内容,如果未能解决你的问题,请参考以下文章

以 00:00:00 时钟格式将 NSTimeInterval 转换为 NSString

IOS--时间 NSDate,NSTimeInterval的一些转换

NSDate NSString时间字符串 NSTimeInterval 的转换

UTC 中的 NSTimeInterval?

舍入一个 NSTimeInterval 对象的值

如何从 NSTimeInterval 获取十分之一秒、百分之一秒等