iPhone: ¿cómo obtener milisegundos actuales?

¿Cuál es la mejor manera de obtener el tiempo actual del sistema milisegundos?

[[NSDate date] timeIntervalSince1970]; 

Devuelve la cantidad de segundos desde epoch como doble. Estoy casi seguro de que puedes acceder a los milisegundos desde la parte fraccionaria.

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

 double CurrentTime = CACurrentMediaTime(); 

Cuál es la manera recomendada; NSDate basa en el reloj de sincronización en red y de vez en cuando ocasionará un error al volver a sincronizarlo con la red.

Devuelve el tiempo absoluto actual, en segundos.


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

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

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

Recomendaría CACurrentMediaTime si quiere la menor sobrecarga y no me 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 pero 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() 

Hasta ahora encontré gettimeofday una buena solución en iOS (iPad), cuando desea realizar una evaluación de intervalo (por ejemplo, velocidad de fotogtwigs, tiempo de un fotogtwig de renderizado …):

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

Swift 2

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

Swift 3

 let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds 

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

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

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

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

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

 #include  struct timeval tv; gettimeofday(&tv,NULL); double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001; 

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

CFAbsoluteTimeGetCurrent ()

El tiempo absoluto se mide en segundos con respecto a la fecha de referencia absoluta del 1 de enero de 2001 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 resultados monótonamente crecientes. El tiempo del sistema puede disminuir debido a la sincronización con referencias de tiempo externas o debido a un cambio de usuario explícito del reloj.

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 con el formateador @ “AAAA-MM-dd HH: mm: ss.SSS” que devolverá la fecha con año, mes, día y 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.

Esta es básicamente la misma respuesta que la publicada por @TristanLorach, acaba de recodificarse para Swift 3:

  /// Method to get Unix-style time (Java variant), ie, time since 1970 in milliseconds. This /// copied from here: http://stackoverflow.com/a/24655601/253938 and here: /// http://stackoverflow.com/a/7885923/253938 /// (This should give good performance according to this: /// http://stackoverflow.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) } 
  func currentmicrotimeTimeMillis() -> Int64{ let nowDoublevaluseis = NSDate().timeIntervalSince1970 return Int64(nowDoublevaluseis*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/

Para obtener milisegundos para la fecha actual.

Swift 4:

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

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

 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]; 

Usando este método:

 [[NSDate date] timeIntervalSince1970]*1000; 

Le gusta System.currentTimeMillis() en Java;