2010-06-08 30 views

Respuesta

256

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

- (NSTimeInterval)timeIntervalSince1970 
+2

¿Este devolver una marca de tiempo Unix Si provisto de un NSDate? – neha

+1

Sí, esto es exactamente lo que estás buscando. UNIX mide el tiempo en segundos desde enero de 1970, y este método devuelve el intervalo entre el receptor (el NSDate proporcionado) y el primer instante del 1 de enero de 1970, GMT. NSTimeInterval es en realidad un typedef de doble. – BAndonovski

+26

Para completar, para convertir una marca de tiempo Unix en NSDate, haga '[NSDate dateWithTimeIntervalSince1970: yourTimestampAsDouble]' – pixelfreak

66

Un Unix timestamp es el número de segundos transcurridos desde las 00:00:00 GMT 1 de enero de 1970. Está representado por el tipo time_t, que suele ser 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 00:00:00 GMT del 1 de enero de 1970. NSTimeInterval es un tipo de coma flotante doble para obtener los segundos y fracciones de segundo.

Dado que ambos tienen la misma referencia (medianoche 1Jan1970 UTC) y son a la vez en cuestión de segundos la conversión es fácil, convertir el NSTimeInterval a un time_t, redondeo o truncamiento en función de sus necesidades:

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970]; 
+0

Esta función me muestra la fecha correcta pero el tiempo es incorrecto. No coincide con la hora del sistema. – neha

+0

La hora de Unix es UTC (GMT), India es UTC + 5.5. ¿Está apagado por 5.5 horas? – progrmr

+0

Sí, casi ... ¿Qué se debe hacer para corregir esto? – neha

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. He aquí un pequeño fragmento de conseguir que:

+ (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]; 
} 
+0

¿Por qué está configurando la hora y el minuto en 0 en los componentes? Además, ¿cómo le dará el UTC exacto basado en esto: '[[NSTimeZone systemTimeZone] secondsFromGMT]]'? Por favor explica poco. – Hemang

+0

Hola amigo me ayudó –

25

Se puede crear una fecha de marca de tiempo Unix de una fecha de la siguiente manera:

int timestamp = [[NSDate date] timeIntervalSince1970]; 
+18

Esto está mal, timeIntervalSince1970 devuelve un TimeInterval que en realidad es un doble. –

5

Mi forma preferida es simplemente:

NSDate.date.timeIntervalSince1970; 
4

Según Sugerencia de @ kexik utilizando la función de tiempo UNIX de la siguiente manera:

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

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

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

+0

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 a obj-c runtime. : P Código de prueba NSLog (@ "time (NULL) =% d; timeIntervalSince1970 =% d", (int) time (NULL), (int) [[NSDate date] timeIntervalSince1970]); – k3a

+0

He enfrentado problemas con [[NSDate date] timeIntervalSince1970]. Ellos parecen considerar la región en la que te encuentras también. –

+0

Sí, esto es lo que creo que experimenté ese día, pero en iOS7 Simulator y iOS6 con GMT + 2 zona horaria ahora parecen iguales ... De todos modos, el tiempo (NULL) funciona siempre :) – k3a

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 UTC, así que convertir nuestra Hora local a la hora UTC.

6

Swift

Actualizado para la Swift 3

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

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

Notas

  • timeIntervalSince1970 vuelve TimeInterval, que es un typealias para Double.
  • Si quería ir a otro lado que podría hacer lo siguiente:

    let myDate = Date(timeIntervalSince1970: myTimeStamp) 
    
0

Si necesita sello de tiempo como una cadena.

time_t result = time(NULL);     
NSString *timeStampString = [@(result) stringValue]; 
Cuestiones relacionadas