españa apple iphone time

apple - iPhone: ¿Cómo obtener milisegundos actuales?



iphone se (18)

CFAbsoluteTimeGetCurrent()

El tiempo absoluto se mide en segundos en relación con la fecha de referencia absoluta del 1 de enero de 2001 a las 00:00:00 GMT. Un valor positivo representa una fecha posterior a la fecha de referencia, un valor negativo representa una fecha anterior. Por ejemplo, el tiempo absoluto -32940326 es equivalente al 16 de diciembre de 1999 a las 17:54:34. Las llamadas repetidas a esta función no garantizan un aumento monótono de los resultados. La hora del sistema puede disminuir debido a la sincronización con referencias de tiempo externas o debido a un cambio explícito del reloj por parte del usuario.

¿Cuál es la mejor manera de obtener los milisegundos actuales del sistema?


Comparé todas las demás respuestas en un iPhone 4S y iPad 3 (versiones de lanzamiento). CACurrentMediaTime tiene la menor sobrecarga en un pequeño margen. timeIntervalSince1970 es mucho más lento que los otros, probablemente debido a la NSDate instanciación de NSDate , aunque puede no ser importante para muchos casos de uso.

Recomendaría CACurrentMediaTime si desea la menor sobrecarga y no le importa agregar la dependencia de Quartz Framework. O gettimeofday si la portabilidad es una prioridad para usted.

iphone 4s

CACurrentMediaTime: 1.33 µs/call gettimeofday: 1.38 µs/call [NSDate timeIntervalSinceReferenceDate]: 1.45 µs/call CFAbsoluteTimeGetCurrent: 1.48 µs/call [[NSDate date] timeIntervalSince1970]: 4.93 µs/call

Ipad 3

CACurrentMediaTime: 1.25 µs/call gettimeofday: 1.33 µs/call CFAbsoluteTimeGetCurrent: 1.34 µs/call [NSDate timeIntervalSinceReferenceDate]: 1.37 µs/call [[NSDate date] timeIntervalSince1970]: 3.47 µs/call


En Swift podemos hacer una función y hacer lo siguiente.

func getCurrentMillis()->Int64{ return Int64(NSDate().timeIntervalSince1970 * 1000) } var currentTime = getCurrentMillis()

Aunque funciona bien en Swift 3.0 , podemos modificar y usar la clase Date lugar de NSDate en 3.0

Swift 3.0

func getCurrentMillis()->Int64 { return Int64(Date().timeIntervalSince1970 * 1000) } var currentTime = getCurrentMillis()


Esta es básicamente la misma respuesta publicada por @TristanLorach, recién recodificada para Swift 3:

/// Method to get Unix-style time (Java variant), i.e., time since 1970 in milliseconds. This /// copied from here: http://.com/a/24655601/253938 and here: /// http://.com/a/7885923/253938 /// (This should give good performance according to this: /// http://.com/a/12020300/253938 ) /// /// Note that it is possible that multiple calls to this method and computing the difference may /// occasionally give problematic results, like an apparently negative interval or a major jump /// forward in time. This is because system time occasionally gets updated due to synchronization /// with a time source on the network (maybe "leap second"), or user setting the clock. public static func currentTimeMillis() -> Int64 { var darwinTime : timeval = timeval(tv_sec: 0, tv_usec: 0) gettimeofday(&darwinTime, nil) return (Int64(darwinTime.tv_sec) * 1000) + Int64(darwinTime.tv_usec / 1000) }


Esto es lo que usé para Swift

var date = NSDate() let currentTime = Int64(date.timeIntervalSince1970 * 1000) print("Time in milliseconds is /(currentTime)")

usé este sitio para verificar la precisión http://currentmillis.com/


Hasta ahora, considero que gettimeofday una buena solución para iOS (iPad), cuando desea realizar una evaluación de intervalo (por ejemplo, la tasa de cuadros, la sincronización de un marco de renderizado ...):

#include <sys/time.h> struct timeval time; gettimeofday(&time, NULL); long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);


Necesitaba un objeto NSNumber que contenga el resultado exacto de [[NSDate date] timeIntervalSince1970] . Ya que esta función fue llamada muchas veces y realmente no necesitaba crear un objeto NSDate , el rendimiento no fue excelente.

Entonces para obtener el formato que me estaba dando la función original, intente esto:

#include <sys/time.h> struct timeval tv; gettimeofday(&tv,NULL); double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001;

Lo que debería darte exactamente el mismo resultado que [[NSDate date] timeIntervalSince1970]


Para obtener milisegundos para la fecha actual.

Swift 4:

func currentTimeInMilliSeconds()-> Int { let currentDate = Date() let since1970 = currentDate.timeIntervalSince1970 return Int(since1970 * 1000) }


Prueba esto :

NSDate * timestamp = [NSDate dateWithTimeIntervalSince1970:[[NSDate date] timeIntervalSince1970]]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss.SSS"]; NSString *newDateString = [dateFormatter stringFromDate:timestamp]; timestamp = (NSDate*)newDateString;

En este ejemplo, dateWithTimeIntervalSince1970 se usa en combinación del formateador @ "YYYY-MM-dd HH: mm: ss.SSS" que devolverá la fecha con año, mes, día y la hora con horas, minutos, segundos y milisegundos . Vea el ejemplo: "2015-12-02 04: 43: 15.008". Utilicé NSString para asegurarme de que el formato se haya escrito antes.


Puede ser útil conocer CodeTimestamps, que proporciona una envoltura alrededor de las funciones de temporización basadas en máquinas. Esto le proporciona datos de tiempo de resolución de nanosegundos: 1000000 veces más precisos que milisegundos. Sí, un millón de veces más preciso. (Los prefijos son milli, micro, nano, cada 1000 veces más precisos que los anteriores). Incluso si no necesita CodeTimestamps, consulte el código (es de código abierto) para ver cómo usan mach para obtener los datos de tiempo. Esto sería útil cuando necesita más precisión y desea un método de llamada más rápido que el enfoque NSDate.

http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/


Si está considerando usar esto para un tiempo relativo (por ejemplo, para juegos o animación) prefiero usar CACurrentMediaTime()

double CurrentTime = CACurrentMediaTime();

Cual es la forma recomendada; NSDate basa en el reloj de sincronización en red y, ocasionalmente, se produce un contratiempo al volver a sincronizarlo con la red.

Devuelve el tiempo absoluto actual, en segundos.

Si solo desea la parte decimal (utilizada a menudo al sincronizar animaciones),

let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)


Utilizando este método:

[[NSDate date] timeIntervalSince1970]*1000;

Es como System.currentTimeMillis() en Java;


[NSDate timeIntervalSinceReferenceDate] es otra opción, si no desea incluir el marco de Quartz. Devuelve un doble, representando segundos.


Swift 2

let seconds = NSDate().timeIntervalSince1970 let milliseconds = seconds * 1000.0

Swift 3

let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds


func currentmicrotimeTimeMillis() -> Int64{ let nowDoublevaluseis = NSDate().timeIntervalSince1970 return Int64(nowDoublevaluseis*1000)

}


// Timestamp after converting to milliseconds. NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];


NSTimeInterval time = ([[NSDate date] timeIntervalSince1970]); //double long digits = (long)time; //first 10 digits int decimalDigits = (int)(fmod(time, 1) * 1000); //3 missing digits /*** long ***/ long timestamp = (digits * 1000) + decimalDigits; /*** string ***/ NSString *timestampString = [NSString stringWithFormat:@"%ld%03d",digits ,decimalDigits];


[[NSDate date] timeIntervalSince1970];

Devuelve el número de segundos desde la época como un doble. Estoy casi seguro de que puede acceder a los milisegundos desde la parte fraccionaria.