2013-02-27 6 views
12

Ich erhalte eine Zeichenfolge von der YouTube JSONC API, aber die Dauer kommt als eine vollständige Zahl, d. H. 2321 statt 23:21 oder 2 statt 0:02. Wie würde ich das beheben?iOS Format String in Minuten und Sekunden

JSON C

EDIT:

int duration = [videos valueForKey:@"duration"]; 
int minutes = duration/60; 
int seconds = duration % 60; 

NSString *time = [NSString stringWithFormat:@"%d:%02d", minutes, seconds]; 
+0

Sind Sie sicher, dass die Dauer Zahl nicht die Anzahl der Sekunden? Also 2321 ist wirklich 38 Minuten und 41 Sekunden? – rmaddy

+0

Es stellt sich heraus, dass ich richtig liege. Der Wert für die Dauer ist die Anzahl der Sekunden. So 2321 ist 2321 Sekunden oder 38 Minuten und 41 Sekunden oder 38:41. Siehe meine Antwort unten. – rmaddy

Antwort

22

den Wert für die Dauer Unter der Annahme, ist wirklich die Dauer in Sekunden an, dann können Sie die Anzahl der Minuten und Sekunden berechnen und dann diejenigen in einen String formatiert werden.

int duration = ... // some duration from the JSON 
int minutes = duration/60; 
int seconds = duration % 60; 

NSString *time = [NSString stringWithFormat:@"%d:%02d", minutes, seconds]; 
+0

Offensichtlich kommt die Stunde falsch. Ohne Ihren tatsächlichen Code zu sehen, gibt es keine Möglichkeit zu wissen, was falsch ist. Aber am wahrscheinlichsten ist es, dass Ihr "duration" Wert mit dem falschen Wert beginnt. – rmaddy

+0

die Dauer Wert kommt direkt aus dem Youtube-Feed – SquiresSquire

+0

Sie haben etwas falsch. Überprüfen Sie, dass "duration" wirklich der richtige Wert ist. Veröffentlichen Sie bei Bedarf Ihren tatsächlichen Code, um den Wert für die Dauer zu erhalten und Stunde und Minute zu berechnen. – rmaddy

0

können Sie die 2321subString und den ersten String als 23 und die zweite als 21 und wandeln sie in int bekommen. Prüfen Sie auch für die Länge des Textes:

if (text.length < 4) 
    //add zeros on the left of String until be of length 4 
2
int sec = diff;//INFO: time in seconds 

int a_sec = 1; 
int a_min = a_sec * 60; 
int an_hour = a_min * 60; 
int a_day = an_hour * 24; 
int a_month = a_day * 30; 
int a_year = a_day * 365; 

NSString *text = @""; 
if (sec >= a_year) 
{ 
    int years = floor(sec/a_year); 
    text = [NSString stringWithFormat:@"%d year%@ ", years, years > 0 ? @"s" : @""]; 
    sec = sec - (years * a_year); 
} 

if (sec >= a_month) 
{ 
    int months = floor(sec/a_month); 
text = [NSString stringWithFormat:@"%@%d month%@ ", text, months, months > 0 ? @"s" : @""]; 
    sec = sec - (months * a_month); 

} 

if (sec >= a_day) 
{ 
    int days = floor(sec/a_day); 
text = [NSString stringWithFormat:@"%@%d day%@ ", text, days, days > 0 ? @"s" : @""]; 

    sec = sec - (days * a_day); 
} 

if (sec >= an_hour) 
{ 
    int hours = floor(sec/an_hour); 
text = [NSString stringWithFormat:@"%@%d hour%@ ", text, hours, hours > 0 ? @"s" : @""]; 

    sec = sec - (hours * an_hour); 
} 

if (sec >= a_min) 
{ 
    int minutes = floor(sec/a_min); 
text = [NSString stringWithFormat:@"%@%d minute%@ ", text, minutes, minutes > 0 ? @"s" : @""]; 

    sec = sec - (minutes * a_min); 
} 

if (sec >= a_sec) 
{ 
    int seconds = floor(sec/a_sec); 
text = [NSString stringWithFormat:@"%@%d second%@", text, seconds, seconds > 0 ? @"s" : @""]; 
} 
    NSLog(@"<%@>", text); 
+0

Ich fand die Syntax der bedingten Formatierung hier besonders hilfreich. Speziell: [Jahre> 0? @ "s": @ ""] –

1

Here ist der große Code, den ich für dieses

int duration = 1221; 
int minutes = floor(duration/60) 
int seconds = round(duration - (minutes * 60)) 
NSString * timeStr = [NSString stringWithFormat:@"%i:%i",minutes,seconds]; 
NSLog(@"Dilip timeStr : %@",timeStr); 

und der Ausgang wird belike diese

Dilip timeStr : 20:21 
6

Versuchen findet diese sehr optimiert

+ (NSString *)timeFormatConvertToSeconds:(NSString *)timeSecs 
{ 
    int totalSeconds=[timeSecs intValue]; 

    int seconds = totalSeconds % 60; 
    int minutes = (totalSeconds/60) % 60; 
    int hours = totalSeconds/3600; 

    return [NSString stringWithFormat:@"%02d:%02d:%02d",hours, minutes, seconds]; 
} 
5

sollten Sie DateComponentsFormatter verwenden, wenn die Dauer Benutzer gerichtete sein soll:

let formatter = DateComponentsFormatter() 
formatter.allowedUnits = [ .minute, .second ] 
formatter.zeroFormattingBehavior = [ .pad ] 
let formattedDuration = formatter.string(from: duration)! 
Verwandte Themen