Если у меня есть NSTimeInterval, для которого установлено значение 200.0, есть ли способ преобразовать его в 00:03:20, я подумал, что могу инициализировать NSDate с ним, а затем использовать NSDateFormatter, используя HH: mm: ss. У меня вопрос: есть ли быстрый способ сделать это или мне нужно самому разбить номер и использовать [NSString stringWithFormat: %02d:%02d:%02d, myHour, myMin, mySec]
?
iphone
objective-c
cocoa-touch
пушистая коза
источник
источник
NSDateComponentsFormatter().stringFromTimeInterval(NSTimeInterval(duration))
в быстромВ iOS 8 используйте
NSDateComponentsFormatter
.NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init]; NSLog(@"%@", [dateComponentsFormatter stringFromTimeInterval:200.0]);
выводит «3:20».
NSDateComponentsFormatter *dateComponentsFormatter = [[NSDateComponentsFormatter alloc] init]; dateComponentsFormatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad; dateComponentsFormatter.allowedUnits = (NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond); NSLog(@"%@", [dateComponentsFormatter stringFromTimeInterval:200.0]);
выводит «0:03:20».
источник
Swift 3 версия ответа onmyway133 :
import Foundation func format(_ duration: TimeInterval) -> String { let formatter = DateComponentsFormatter() formatter.zeroFormattingBehavior = .pad formatter.allowedUnits = [.minute, .second] if duration >= 3600 { formatter.allowedUnits.insert(.hour) } return formatter.string(from: duration)! } print(format(12)) // 0:12 print(format(65)) // 1:05 print(format(1750)) // 29:10 print(format(3890)) // 1:04:50 print(format(45720)) // 12:42:00
источник
zeroFormattingBehavior
, что[.dropLeading, .pad]
может быть лучшим вариантом (меньше кода).Несколько дополнительных строк кода, но я чувствую, что использование NSDateComponents даст более точное значение.
- (NSString *)getTimeRepresentationFromDate:(NSDate *)iDate withTimeInterval:(NSTimeInterval)iTimeInterval { NSString *aReturnValue = nil; NSDate *aNewDate = [iDate dateByAddingTimeInterval:iTimeInterval]; unsigned int theUnits = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSCalendar *aCalender = [NSCalendar currentCalendar]; NSDateComponents *aDateComponents = [aCalender components:theUnits fromDate:iDate toDate:aNewDate options:0]; aReturnValue = [NSString stringWithFormat:@"%d:%d:%d", [aDateComponents hour], [aDateComponents minute], [aDateComponents second]]; return aReturnValue; }
источник
В Swift 2 , IOS , 8+ . Это гарантирует, что мы показываем час только тогда, когда это необходимо.
func format(duration: NSTimeInterval) -> String { let formatter = NSDateComponentsFormatter() formatter.zeroFormattingBehavior = .Pad if duration >= 3600 { formatter.allowedUnits = [.Hour, .Minute, .Second] } else { formatter.allowedUnits = [.Minute, .Second] } return formatter.stringFromTimeInterval(duration) ?? "" }
Так что у тебя есть
print(format(12)) // 0:12 print(format(65)) // 1:05 print(format(1750)) // 29:10 print(format(3890)) // 1:04:50 print(format(45720)) // 12:42:00
источник
NSTimeInterval ti = 3667; double hours = floor(ti / 60 / 60); double minutes = floor((ti - (hours * 60 * 60)) / 60); double seconds = floor(ti - (hours * 60 * 60) - (minutes * 60));
источник
Swift 4
пример:
DateComponentsFormatter().string(from: 59.0)
источник
Чтобы «расширить» предложение Маттиаса Бауха, в Swift я бы сделал это вычисляемым свойством NSTimeInterval:
extension NSTimeInterval { var stringValue: String { let interval = Int(self) let seconds = interval % 60 let minutes = (interval / 60) % 60 let hours = (interval / 3600) return String(format: "%02d:%02d:%02d", hours, minutes, seconds) } }
Преимущество этого заключается в том, что он привязан к
NSTimeInterval
типу, а не к вашему контроллеру представления или где еще вы поместили эту функцию. Чтобы использовать, вы должны пойти примерно так:let timeInterval = NSDate().timeIntervalSinceDate(start) self.elapsedTimeLabel.text = timeInterval.stringValue
источник
Основываясь на ответе @ onmyway133, вот версия Swift 4:
func format(duration: TimeInterval) -> String { let formatter = DateComponentsFormatter() formatter.zeroFormattingBehavior = .pad if duration >= 3600 { formatter.allowedUnits = [.hour, .minute, .second]; } else { formatter.allowedUnits = [.minute, .second]; } return formatter.string(from: duration) ?? ""; }
источник
прямо из документации Apple: в файле h:
@property(strong,nonatomic)NSDateComponentsFormatter *timerFormatter;
в м файле
@synthesize timerFormatter; - (void)viewDidLoad { [super viewDidLoad]; NSDateComponentsFormatter *timerFormatter = [[NSDateComponentsFormatter alloc] init]; timerFormatter.unitsStyle = NSDateComponentsFormatterUnitsStylePositional; //10:59 Positional THIS ONE DOES NOT SEEM TO WORK iOS<9 WHEN <1Minute JUST SHOWS 01, 10m 59s Abbreviated, 10min 59sec Short, 10minutes 59seconds Full ... timerFormatter.allowedUnits = NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond; }
где бы вам ни потребовалось преобразовать ваш NSTimeInterval timeInterval в строку hh: mm: ss, сделайте следующее:
NSString *txt=[timerFormatter stringFromTimeInterval:timeInterval];
источник
Я полагаю, что дробь таймера должна быть отключена. Поскольку код Матиаса создавал эту проблему за секунды, я использую следующее, немного измененное по сравнению с кодом Матиаса
- (NSString *)stringFromTimeInterval:(NSTimeInterval)interval { int ti = (int) ceil(interval); int seconds = ti % 60; int minutes = (ti / 60) % 60; int hours = (ti / 3600); return [NSString stringWithFormat:@"%02d:%02d:%02d",hours, minutes, seconds]; }
источник
Objective C версия ответа onmyway133
- (NSString*) formatTimeInterval:(NSTimeInterval) timeInterval { NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init]; formatter.zeroFormattingBehavior = NSDateComponentsFormatterZeroFormattingBehaviorPad; if (timeInterval > 3600) { formatter.allowedUnits = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; } else { formatter.allowedUnits = NSCalendarUnitMinute | NSCalendarUnitSecond; } return [formatter stringFromTimeInterval:timeInterval]; }
источник