2010-09-09 16 views
13

Necesito sincronizar algunos eventos en la aplicación en la que estoy trabajando. En Java solía poder llamar a currentTimeMillis(), pero no parece haber una versión en Objective-c. ¿Hay alguna manera de verificar la hora actual sin crear un NSDate y luego analizar este objeto cada vez que necesito esta información?¿Hay una versión objetivo-c/iPhone de currentTimeMillis() de Java?

Gracias -Code

Respuesta

11

También hay CFAbsoluteTimeGetCurrent(), que le dará el tiempo en segundos de precisión doble.

7

Para conseguir muy barato tiempo muy preciso, puede utilizar gettimeofday(), que es una función C del kernel BSD. Por favor, lea la página del manual para más detalles, pero aquí hay un ejemplo simple:

struct timeval t; 
gettimeofday(&t, NULL); 

long msec = t.tv_sec * 1000 + t.tv_usec/1000; 
+0

Derecho, esto es más barato que '[[NSDate date] timeIntervalSince1970] * 1000'. Vuelve el intervalo desde la medianoche (0 hora) 1/1/1970. Debe usar 'gettimeofday (& t, NULL);' si su código se llama con frecuencia como update loop en el juego. Se utilizará un tipo de datos largos para este gran valor: 'long long millis = t.tv_sec * 1000 + t.tv_usec/1000;' – hieund

2

lugar gettimeofday() También es posible usar [NSDate timeIntervalSinceReferenceDate] (método de clasificación) y hacer sus cálculos con eso. Pero tienen el mismo problema: operan en "tiempo de reloj de pared". Eso significa que su medición puede estar desactivada si se agregan segundos intercalares mientras se ejecuta la prueba o en la transición entre el horario de verano.

Puede usar la llamada al sistema Mach mach_absolute_time() en OS X e iOS. Con la información devuelta por mach_timebase_info() esto se puede convertir a nanosegundos.

8

[[NSDate date] timeIntervalSince1970] * 1000 devuelve una el mismo valor que currentTimeMillis()

CFAbsoluteTimeGetCurrent() y [NSDate timeIntervalSinceReferenceDate] ambos devuelven un doble partida JAN 1 de 2001 00:00:00 GMT.

+1

No realmente. 'timeIntervalSince1970' devuelve el tiempo en segundos, mientras que el nombre' currentTimeMillis() 'implica que devuelve milisegundos. – Sven

+0

@Sven: Muy cierto, acabo de editar mi respuesta. Gracias – tidwall

0

La respuesta correcta es [[NSDate date] timeIntervalSince1970]; esto le dará la marca de tiempo actual en milisegundos.

La respuesta dada por @Noah Witherspoon devuelve la fecha actual pero el año no coincide con el año actual.

Cuestiones relacionadas