2010-09-09 2 views
13

J'ai besoin de chronométrer quelques événements dans l'application sur laquelle je travaille. En Java j'avais l'habitude d'appeler currentTimeMillis() mais il ne semble pas y avoir de version dans Objective-c. Y at-il un moyen de vérifier l'heure actuelle sans créer un NSDate, puis d'analyser cet objet chaque fois que j'ai besoin de cette information?Existe-t-il une version objective-c/iPhone de currentTimeMillis() de Java?

Merci -Code

Répondre

11

Il y a aussi CFAbsoluteTimeGetCurrent(), qui vous donnera le temps en secondes double précision.

7

Pour obtenir vraiment pas cher temps très précis, vous pouvez utiliser gettimeofday(), qui est une fonction C du noyau BSD. S'il vous plaît lire la page de manuel pour plus de détails, mais voici un exemple simple:

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

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

À droite, c'est moins cher que '[[NSDate date] timeIntervalSince1970] * 1000'. Il retourne intervalle de minuit (0 heure) 1/1/1970. Vous devriez utiliser 'gettimeofday (& t, NULL);' si votre code est appelé très souvent comme boucle de mise à jour sur le jeu. Vous utiliseriez un type de données long et long pour cette grande valeur: 'long long millis = t.tv_sec * 1000 + t.tv_usec/1000;' – hieund

2

Au lieu de cela gettimeofday() vous pouvez également utiliser [NSDate timeIntervalSinceReferenceDate] (la méthode de classe) et faire vos calculs avec cela. Mais ils ont le même problème: ils fonctionnent sur "l'heure de l'horloge murale". Cela signifie que votre mesure peut être désactivée si des secondes intercalaires sont ajoutées pendant que votre test est en cours ou à la transition entre l'heure d'été.

Vous pouvez utiliser l'appel système Mach mach_absolute_time() sous OS X et iOS. Avec les informations renvoyées par mach_timebase_info() cela peut être converti en nanosecondes.

8

[[NSDate date] timeIntervalSince1970] * 1000 retourne un même valeur que currentTimeMillis()

CFAbsoluteTimeGetCurrent() et [NSDate timeIntervalSinceReferenceDate] deux retournent un double départ à Jan 2001 00:00:00 1 de GMT.

+1

Pas vraiment. 'timeIntervalSince1970' renvoie l'heure en secondes, tandis que le nom' currentTimeMillis() 'implique qu'il renvoie des millisecondes. – Sven

+0

@Sven: Très vrai, je viens d'éditer ma réponse. Merci – tidwall

0

La réponse correcte est [[NSDate date] timeIntervalSince1970]; Cela vous donnera l'horodatage actuel en millisecondes.

La réponse de @Noah Witherspoon renvoie la date actuelle mais l'année n'est pas l'année correspondante.

Questions connexes