2010-10-28 14 views
11

Tengo la aplicación que es un temporizador básico. Realiza un seguimiento de la cantidad de segundos que se ejecutó la aplicación. Quiero convertirlo para que los segundos (NSUInteger) se muestren como: 00:00:12 (hh: mm: ss). Por lo que he leído este post:Formateo de segundos en hh: ii: ss

NSNumber of seconds to Hours, minutes, seconds

Desde que escribí este código:

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[self meeting] elapsedSeconds]]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"hh:mm:ss"]; 

Funciona bien, pero comienza con 4:00:00. No estoy seguro por qué. También he intentado hacer algo como:

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:[[self meeting] elapsedSeconds] * -1]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"hh:mm:ss"]; 

pensando que iba a mostrar el contador correctamente, pero hace un extraño 1:23:00, a continuación, sólo Flops a 4:00:00 y permanece allí por el resto de el tiempo.

MS

+0

creo que [esto] (http://stackoverflow.com/questions/4042958/how-to-find-the-difference-between-two-dates- in-hhmmss-format-in-objective-c/4043251 # 4043251) es lo que estás buscando. Haría el paso 3 y el 'ti' en ese código es su' elapsedSeconds'. Asegúrese de dar una respuesta al contestador de esa pregunta (no a mí) si ayuda. – Anna

+0

Gracias ABO. Aunque pensé que al usar NSDateFormatter no tendría que calcular todas las piezas ... ¿alguna reflexión sobre eso? –

+0

NSDateFormatter es para dar formato a las fechas/horas (como a las 3 p.m.), no a una duración o cantidad de segundos transcurridos, que es lo que tiene. – Anna

Respuesta

49

Esto es similar a un previous answer hora de formatear, pero no requiere un formateador fecha porque no estamos tratando con las fechas más.

Si tiene el número de segundos almacenados como un entero, se puede trabajar los componentes individuales de tiempo a ti mismo:

NSUInteger h = elapsedSeconds/3600; 
NSUInteger m = (elapsedSeconds/60) % 60; 
NSUInteger s = elapsedSeconds % 60; 

NSString *formattedTime = [NSString stringWithFormat:@"%u:%02u:%02u", h, m, s]; 
+1

Excelente, ¿por qué lidiar con timeozone sin sentido! – Andy

+0

Sí y lol simple – Alan10977

+0

@downvoter - explique el motivo del voto a favor para que pueda solucionarlo (o incluso resuelva usted mismo la respuesta) – dreamlax

7

Mientras que hay maneras más fáciles de hacer esto (@dreamlax tiene un muy buen sentido) , permítanme explicar lo que está mal con su ejemplo y vamos a hacer que funcione:

en primer lugar, la razón por la que está mostrando 04:00:00 (así, es probable que en realidad mostrando 04:00:12) se debe a que es la conversión de la hora a la hora UTC/GMT a tu hora local. Para solucionar este problema, es necesario agregar la siguiente línea:

[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

Entonces, ya no aparecerá 04:00:12 porque no convierte la zona horaria. Desafortunadamente, ahora mostrará 12:00:12 en lugar de 00:00:12 porque es medianoche. Con el fin de arreglar eso, habría que convertir la cadena en tiempo de 24 horas en lugar de usar el formateador HH en lugar de hh:

[formatter setDateFormat:@"HH:mm:ss"]; 

Tenga en cuenta que, dado que este fue diseñado para trabajar con los tiempos, que no va a trabajar por más de 24 horas (porque se "reiniciará" hasta la medianoche de nuevo).

El código completo sería:

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[self meeting] elapsedSeconds]]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"HH:mm:ss"]; 
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

NSLog(@"%@", [formatter stringFromDate:date]); 
// Results: 00:00:12 
Cuestiones relacionadas