¿Cómo convertir una NSDate
marca de tiempo en Unix? He leído muchas publicaciones que hacen lo contrario. Pero no encuentro nada relacionado con mi pregunta.
fuente
¿Cómo convertir una NSDate
marca de tiempo en Unix? He leído muchas publicaciones que hacen lo contrario. Pero no encuentro nada relacionado con mi pregunta.
Creo que este es el selector de NSDate que estás buscando:
- (NSTimeInterval)timeIntervalSince1970
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];
int unixTime = floor([piece.piece_last_view timeIntervalSince1970])
donde piece.piece.last_view es un NSDate
Puede crear una fecha de marca de tiempo de Unix a partir de una fecha de esta manera:
NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
- (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.
Actualizado para Swift 3
// current date and time
let someDate = Date()
// time interval since 1970
let myTimeStamp = someDate.timeIntervalSince1970
Notas
timeIntervalSince1970
devuelve TimeInterval
, que es un typealias para Double
.
Si quisieras ir hacia otro lado, podrías hacer lo siguiente:
let myDate = Date(timeIntervalSince1970: myTimeStamp)
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];
}
[[NSTimeZone systemTimeZone] secondsFromGMT]]
:? Por favor explique poco.
Mi forma preferida es simplemente:
NSDate.date.timeIntervalSince1970;
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.
[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
Si necesita una marca de tiempo como una cadena.
time_t result = time(NULL);
NSString *timeStampString = [@(result) stringValue];