2011-11-01 18 views
15

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

tengo que hacerlo de esta manera debido a que el NSTimeInterval necesita ser convertido a un int utilizando lround para redondear, después se convierte en un NSDate utilizar el NSDateFormatter para tirarlo en una cadena.

Respuesta

32

Un NSTimeInterval, como su nombre, um, implica, no representa lo mismo que NSDate. Un NSDate es un momento a tiempo. Un intervalo de tiempo es un lapso de tiempo. Para obtener un punto de un intervalo, debes tener otro punto. Su pregunta es como preguntar "¿Cómo convierto 12 pulgadas a un punto en este tablero que estoy cortando?" Bueno, 12 pulgadas, comenzando desde donde?

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

Dicho esto, estoy bastante seguro de que está 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, debería usar el nuevo intervalo. Por ejemplo (suponiendo que tiene una cocción temporizador 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); 
} 
6

Si usted tiene su fecha de inicio almacenado en un objeto NSDate, se puede obtener una nueva fecha de cualquier intervalo en el futuro. Sólo tiene que utilizar dateByAddingTimeInterval: así:

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

Yo aconsejaría contra el uso de NSDateFormatter si desea mostrar los intervalos de tiempo. NSDateFormatter es útil cuando desea mostrar horas en la zona horaria local o específica. Pero en este caso sería un error si la hora fuera la zona horaria ajustada (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]; 
+0

perfecto! ¡justo lo que necesitaba! – hfossli

14

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

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

Ole K Hornnes

2

Via apple developers:

// 1408709486 - tiempo de valor de intervalo

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

0

Como respuesta Josh detalló la forma correcta, si aún desea que el intervalo esté en 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;} 
0

NSTimeInterval a NSDate conversión en Swift:

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