web-dev-qa-db-fra.com

Mise en forme NSTimeInterval

Je veux prendre ma NSTimeInterval et la formater en chaîne 00:00:00 (heures, minutes, secondes). Quelle est la meilleure façon de procéder?

40
Baub
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);
27
Michael Frederick

Depuis iOS 8.0, il existe maintenant NSDateComponentsFormatter qui a une méthode stringFromTimeInterval:.

[[NSDateComponentsFormatter new] stringFromTimeInterval:timeInterval];
104
Johan Kool

"Best" est subjectif. La manière la plus simple est la suivante:

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

METTRE À JOUR

À partir de iOS 8.0 et de Mac OS X 10.10 (Yosemite), vous pouvez utiliser NSDateComponentsFormatter si vous avez besoin d’une solution compatible avec les paramètres régionaux. Exemple:

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

Cependant, je ne vois pas le moyen de le forcer à sortir deux chiffres pour l'heure, donc si c'est important pour vous, vous devrez utiliser une solution différente.

60
rob mayoff

Swift 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)
    }
}

Code de test:

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

// output "26:40:00"

Changez unitStyle pour obtenir des styles différents. comme formatter.unitsStyle = .abbreviated get 

sortie: "26h 40m 0s"

0
William Hu

Une version rapide de la réponse de @Michael Frederick:

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)
0
richdcs