objective-c nsdate nsdateformatter nstimeinterval

objective c - NSTimeInterval para NSDate



objective-c nsdateformatter (7)

A través de los desarrolladores de Apple :

// 1408709486 - valor de intervalo de tiempo

NSDate *lastUpdate = [[NSDate alloc] initWithTimeIntervalSince1970:1408709486]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; [dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; NSLog(@"date time: %@", [dateFormatter stringFromDate:lastUpdate]);

Obtendrá: fecha hora: 22 de agosto de 2014, 3:11:26 PM

¿Cómo puedo convertir un NSTimeInterval a NSDate ? Piensa en ello como un cronómetro. Quiero que la fecha inicial sea 00:00:00, y tengo un NSTimeInterval de X segundos.

Necesito hacerlo así porque el NSTimeInterval debe convertir en un int utilizando lround para redondear, y luego se convierte en un NSDate para usar el NSDateFormatter para lanzarlo en una cadena.


Como Josh respondió detalladamente, si todavía desea que el intervalo esté en el formato NSDate, puede usar el siguiente método

+ (NSDate *) dateForHour:(int) hour andMinute: (int) minute{ NSDateComponents * components = [NSDateComponents new]; components.hour = hour; components.minute = minute; NSDate * retDate = [[NSCalendar currentCalendar] dateFromComponents:components]; return retDate;}


Si tiene su fecha inicial almacenada en un objeto NSDate , puede obtener una nueva fecha en cualquier intervalo en el futuro. Simplemente use dateByAddingTimeInterval: así:

NSDate * originalDate = [NSDate date]; NSTimeInterval interval = 1; NSDate * futureDate = [originalDate dateByAddingTimeInterval:interval];


Un NSTimeInterval , como su nombre, um, implica, no representa lo mismo que un NSDate . Un NSDate es un momento en el tiempo. Un intervalo de tiempo es un tramo de tiempo. Para obtener un punto de un intervalo, debe tener otro punto. Tu pregunta es como preguntar "¿Cómo convierto 12 pulgadas a un lugar en este tablero que estoy cortando?" Bueno, 12 pulgadas, ¿a partir de dónde ?

Tienes que elegir una fecha de referencia. Es muy probable que este sea el NSDate representa la hora en que comenzó su contador. Luego puede usar +[NSDate dateWithTimeInterval:sinceDate:] o -[NSDate dateByAddingTimeInterval:]

Dicho esto, estoy bastante seguro de que estás pensando en esto al revés. Está intentando mostrar el tiempo transcurrido desde algún punto de inicio, es decir, el intervalo , no la hora actual. Cada vez que actualice la pantalla, solo debe usar el nuevo intervalo. Por ejemplo (asumiendo que tiene un temporizador que se dispara periódicamente para hacer la actualización):

- (void) updateElapsedTimeDisplay: (NSTimer *)tim { // You could also have stored the start time using // CFAbsoluteTimeGetCurrent() NSTimeInterval elapsedTime = [startDate timeIntervalSinceNow]; // Divide the interval by 3600 and keep the quotient and remainder div_t h = div(elapsedTime, 3600); int hours = h.quot; // Divide the remainder by 60; the quotient is minutes, the remainder // is seconds. div_t m = div(h.rem, 60); int minutes = m.quot; int seconds = m.rem; // If you want to get the individual digits of the units, use div again // with a divisor of 10. NSLog(@"%d:%d:%d", hours, minutes, seconds); }


Una conversión fácil desde y hacia atrás se muestra aquí:

NSDate * now = [NSDate date]; NSTimeInterval tiNow = [now timeIntervalSinceReferenceDate]; NSDate * newNow = [NSDate dateWithTimeIntervalSinceReferenceDate:tiNow];

Ole K Hornnes


NSTimeInterval de NSTimeInterval a NSDate en Swift:

let timeInterval = NSDate.timeIntervalSinceReferenceDate() // this is the time interval NSDate(timeIntervalSinceReferenceDate: timeInterval)


NSDateFormatter usar NSDateFormatter si desea mostrar intervalos de tiempo. NSDateFormatter es útil cuando desea mostrar horas en una zona horaria local o específica. Pero en este caso sería un error si se ajustara la zona horaria (por ejemplo, un día por año tiene 23 horas).

NSTimeInterval time = ...; NSString *string = [NSString stringWithFormat:@"%02li:%02li:%02li", lround(floor(time / 3600.)) % 100, lround(floor(time / 60.)) % 60, lround(floor(time)) % 60];