¿Cómo convertir NSDate en unix timetamp iphone sdk?

143

¿Cómo convertir una NSDatemarca de tiempo en Unix? He leído muchas publicaciones que hacen lo contrario. Pero no encuentro nada relacionado con mi pregunta.

neha
fuente

Respuestas:

269

Creo que este es el selector de NSDate que estás buscando:

- (NSTimeInterval)timeIntervalSince1970
BAndonovski
fuente
2
¿Esto devuelve una marca de tiempo de Unix si se proporciona con una fecha n?
neha
1
Sí, esto es exactamente lo que estás buscando. UNIX mide el tiempo en segundos desde el 1 de enero de 1970, y este método devuelve el intervalo entre el receptor (el NSDate que proporciona) y el primer instante del 1 de enero de 1970, GMT. NSTimeInterval es en realidad un typedef de doble.
BAndonovski
26
Para obtener una cadena (28/11/2011 14:14:13 <-> 1322486053): [NSString stringWithFormat: @ "%. 0f", [aDate timeIntervalSince1970]];
ǝʞɾuǝʞ
2
El método cambia en función del tiempo establecido en el dispositivo en general. Hice una prueba donde obtuve la marca de tiempo a las 12 p.m., luego cambié alrededor del tiempo en el iPad a aproximadamente las 8 p.m. y la diferencia en los dos números fue extremadamente alta. Si la marca de tiempo no dependía del tiempo del dispositivo, los números deberían haber estado apagados por solo unos segundos, pero en este caso tuve que concluir que el tiempo en el iPad afecta el unixTimeStamp
Esko918
1
@ Esko918 Bueno, por supuesto. El tiempo de Unix describe el número de segundos desde 1970 hasta el momento en que desea especificar ("ahora" en este caso). Si cambia la hora en su iPad, efectivamente cambia "ahora" a otra hora y de ahí la diferencia en las marcas de tiempo.
marsbear
69

Una marca de tiempo Unix es el número de segundos desde las 00:00:00 UTC del 1 de enero de 1970. Está representada por el tipo time_t , que generalmente es un tipo entero de 32 bits con signo (largo o int).

iOS proporciona - (NSTimeInterval) timeIntervalSince1970 para objetos NSDate que devuelve el número de segundos desde las 00:00:00 GMT del 1 de enero de 1970. NSTimeInterval es un tipo de coma flotante doble para que obtenga los segundos y fracciones de segundo.

Dado que ambos tienen la misma referencia (medianoche 1 de enero de 1970 UTC) y ambos están en segundos, la conversión es fácil, convierta el NSTimeInterval a time_t, redondeando o truncando según sus necesidades:

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
programador
fuente
Esta función me muestra la fecha correcta pero la hora es incorrecta. No coincide con la hora del sistema.
neha
La hora de Unix es UTC (GMT), India es UTC + 5.5. ¿Está apagado por 5,5 horas?
programa
77
La hora de su sistema muestra la hora en su zona horaria local, lo cual está bien. La marca de tiempo de Unix no es la hora local, siempre es la hora UTC, difiere en +5: 30 en India, -7: 00 desde aquí. Eso es correcto.
programa
Pero entonces, ¿cómo usarlo? ¿Puedo usarlo en mis cálculos más tarde? Tengo una marca de tiempo UNIX de una base de datos PHP en línea y luego esta. Quiero comparar los dos para tomar la decisión de descargar los últimos datos sobre un objeto.
JeroenEijkhof
Solo estoy haciendo esto ahora: int unixTime = floor([piece.piece_last_view timeIntervalSince1970]) donde piece.piece.last_view es un NSDate
JeroenEijkhof
26

Puede crear una fecha de marca de tiempo de Unix a partir de una fecha de esta manera:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
Peter Van de Put
fuente
21
Esto está mal, timeIntervalSince1970 devuelve un TimeInterval que en realidad es un doble.
Matt Wolfe
9
- (void)GetCurrentTimeStamp
    {
        NSDateFormatter *objDateformat = [[NSDateFormatter alloc] init];
        [objDateformat setDateFormat:@"yyyy-MM-dd"];
        NSString    *strTime = [objDateformat stringFromDate:[NSDate date]];
        NSString    *strUTCTime = [self GetUTCDateTimeFromLocalTime:strTime];//You can pass your date but be carefull about your date format of NSDateFormatter.
        NSDate *objUTCDate  = [objDateformat dateFromString:strUTCTime];
        long long milliseconds = (long long)([objUTCDate timeIntervalSince1970] * 1000.0);

        NSString *strTimeStamp = [Nsstring stringwithformat:@"%lld",milliseconds];
        NSLog(@"The Timestamp is = %@",strTimestamp);
    }

 - (NSString *) GetUTCDateTimeFromLocalTime:(NSString *)IN_strLocalTime
    {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd"];
        NSDate  *objDate    = [dateFormatter dateFromString:IN_strLocalTime];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        NSString *strDateTime   = [dateFormatter stringFromDate:objDate];
        return strDateTime;
    }

NOTA: - La marca de tiempo debe estar en la zona UTC, por lo que convierto nuestra hora local en hora UTC.

Vicky
fuente
6

Rápido

Actualizado para Swift 3

// current date and time
let someDate = Date()

// time interval since 1970
let myTimeStamp = someDate.timeIntervalSince1970

Notas

  • timeIntervalSince1970devuelve TimeInterval, que es un typealias para Double.

  • Si quisieras ir hacia otro lado, podrías hacer lo siguiente:

      let myDate = Date(timeIntervalSince1970: myTimeStamp)
Suragch
fuente
5

Si desea almacenar este tiempo en una base de datos o enviarlo a través del servidor ... lo mejor es usar marcas de tiempo Unix. Aquí hay un pequeño fragmento para obtener eso:

+ (NSTimeInterval)getUTCFormateDate{

    NSDateComponents *comps = [[NSCalendar currentCalendar] 
                               components:NSDayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit 
                               fromDate:[NSDate date]];
    [comps setHour:0];
    [comps setMinute:0];    
    [comps setSecond:[[NSTimeZone systemTimeZone] secondsFromGMT]];

    return [[[NSCalendar currentCalendar] dateFromComponents:comps] timeIntervalSince1970];  
}
aahsanali
fuente
¿Por qué está configurando la hora y los minutos a 0 en componentes? Además, ¿cómo le dará UTC exacto basado en esto [[NSTimeZone systemTimeZone] secondsFromGMT]]:? Por favor explique poco.
Hemang
Hola amigo, me ayudó
Rahul K Rajan
5

Mi forma preferida es simplemente:

NSDate.date.timeIntervalSince1970;
Alex
fuente
4

Según la sugerencia de @ kexik usando la función de tiempo UNIX como se muestra a continuación:

  time_t result = time(NULL);
  NSLog([NSString stringWithFormat:@"The current Unix epoch time is %d",(int)result]);

Según mi experiencia, no use timeIntervalSince1970, da la marca de tiempo de la época, la cantidad de segundos que está detrás de GMT.

Solía ​​haber un error con [[NSDate date] timeIntervalSince1970], solía sumar / restar tiempo en función de la zona horaria del teléfono, pero parece estar resuelto ahora.

Tapan Thaker
fuente
Estoy corrigiendo mi respuesta, realmente parece ser igual. Aunque el tiempo (NULL) puede ser un poco más rápido ya que no está llamando al tiempo de ejecución obj-c. : P Código de prueba NSLog (@ "time (NULL) =% d; timeIntervalSince1970 =% d", (int) time (NULL), (int) [[NSDate date] timeIntervalSince1970]);
k3a
Me he enfrentado a problemas con [[NSDate date] timeIntervalSince1970]. Parece que también consideran la región en la que te encuentras.
Tapan Thaker
Sí, esto es lo que creo que experimenté ese día, pero en el simulador iOS7 y el dispositivo iOS6 con zona horaria GMT + 2 ahora parecen iguales ... De todos modos, el tiempo (NULL) siempre funciona :)
k3a
2
 [NSString stringWithFormat: @"first unixtime is %ld",message,(long)[[NSDate date] timeIntervalSince1970]];

 [NSString stringWithFormat: @"second unixtime is %ld",message,[[NSDate date] timeIntervalSince1970]];

 [NSString stringWithFormat: @"third unixtime is %.0f",message,[[NSDate date] timeIntervalSince1970]]; 

primer unixtime 1532278070

segundo unixtime 1532278070.461380

tercer unixtime 1532278070

usuario1105951
fuente
0

Si necesita una marca de tiempo como una cadena.

time_t result = time(NULL);                
NSString *timeStampString = [@(result) stringValue];
nanjunda
fuente