Nat*_*han 3 time objective-c nsdate nsdateformatter ios
我正在使用 NSDateFormatter 来格式化持续时间(请参阅此处)。
我想使用这样的格式:“3 小时 15 分钟”。
这是我正在使用的格式字符串:@"H' hours, 'm' minutes'".
问题是,对于短于一小时的持续时间,结果类似于“0 小时 35 分钟”。
在这种情况下,我只想显示“35 分钟”。
有没有办法告诉 NSDateFormatter 根本不显示小时,如果没有,或者我应该只使用 if 语句并手动构造字符串?
编辑:
我很清楚这很容易用几行额外的行手动完成,这就是我过去所做的。我只是想知道格式化程序是否有足够的智能来自行处理这个问题,因为这似乎是一个常见问题。
从 iOS 8.0 和 Mac OS X 10.10 (Yosemite) 开始,您可以使用NSDateComponentsFormatter. 因此,让使用小时和分钟的allowedUnits(如你的例子),并NSDateComponentsFormatterZeroFormattingBehaviorDropLeading作为zeroFormattingBehavior降为零小时。例子:
NSTimeInterval intervalWithHours = 11700; // 3:15:00
NSTimeInterval intervalWithZeroHours = 2100; // 0:35:00
NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
formatter.allowedUnits = NSCalendarUnitHour | NSCalendarUnitMinute;
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull;
formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorDropLeading;
NSString *string = [formatter stringFromTimeInterval:intervalWithHours];
NSString *stringWithoutHours = [formatter stringFromTimeInterval:intervalWithZeroHours];
NSLog(@"%@ / %@", string, stringWithoutHours);
// output: 3 hours, 15 minutes / 35 minutes
Run Code Online (Sandbox Code Playgroud)
斯威夫特 5 版本:
let intervalWithHours: TimeInterval = 11700
let intervalWithZeroHours: TimeInterval = 2100
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute]
formatter.unitsStyle = .full
formatter.zeroFormattingBehavior = .dropLeading
if let string = formatter.string(from: intervalWithHours), let stringWithoutHours = formatter.string(from: intervalWithZeroHours) {
print("\(string) / \(stringWithoutHours)")
// output: "3 hours, 15 minutes / 35 minutes\n"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1862 次 |
| 最近记录: |