web-dev-qa-db-fra.com

iPhone: Comment obtenir les millisecondes actuelles?

Quel est le meilleur moyen d'obtenir les millisecondes du système actuel?

203
phil
[[NSDate date] timeIntervalSince1970];

Il renvoie le nombre de secondes depuis Epoch sous forme de double. Je suis presque sûr que vous pouvez accéder aux millisecondes à partir de la partie fractionnaire.

264
codelogic

Si vous envisagez d'utiliser ceci pour le timing relatif (par exemple pour les jeux ou l'animation), je préférerais utiliser CACurrentMediaTime ()

double CurrentTime = CACurrentMediaTime();

Quel est le moyen recommandé? NSDate tire de l'horloge de synchronisation en réseau et hésite parfois lorsque vous la resynchronisez avec le réseau.

Il renvoie le temps absolu actuel, en secondes.


Si vous voulez seulement la partie décimale (souvent utilisée lors de la synchronisation des animations),

let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)
303
Allan Simonsen

J'ai comparé toutes les autres réponses sur un iPhone 4S et un iPad 3 (build builds). CACurrentMediaTime a le moins de frais généraux par une petite marge. timeIntervalSince1970 est beaucoup plus lent que les autres, probablement en raison de la surcharge de l'instanciation NSDate, bien que cela ne soit pas important dans de nombreux cas d'utilisation.

Je recommanderais CACurrentMediaTime si vous voulez le moins de frais généraux et que cela ne vous gêne pas d'ajouter la dépendance à Quartz Framework. Ou gettimeofday si la portabilité est une priorité pour vous.

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
90
darrinm

Dans Swift, nous pouvons créer une fonction et procéder comme suit

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

var currentTime = getCurrentMillis()

Bien que cela fonctionne bien dans Swift 3.0 mais nous pouvons modifier et utiliser la classe Date au lieu de NSDate dans 3.0  

Swift 3.0

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

var currentTime = getCurrentMillis()
44
Rajan Maheshwari

Jusqu'à présent, j'ai trouvé gettimeofday une bonne solution sur iOS (iPad), lorsque vous souhaitez effectuer une évaluation d'intervalle (par exemple, le nombre d'images par seconde, le temps d'une image rendue ...):

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

Swift 2

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

Swift 3

let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds
17
quemeful

Pour obtenir des millisecondes pour la date actuelle.

Swift 4:

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

Il peut être utile de connaître CodeTimestamps, qui fournit une enveloppe autour des fonctions de synchronisation basées sur mach. Cela vous donne des données de synchronisation en nanosecondes - 1 000 fois plus précises que plusieurs millisecondes. Oui, un million de fois plus précis. (Les préfixes sont milli, micro, nano, chaque fois plus précis que le dernier.) Même si vous n'avez pas besoin de CodeTimestamps, consultez le code (il est open source) pour voir comment ils utilisent mach pour obtenir les données de synchronisation. Cela serait utile si vous avez besoin de plus de précision et souhaitez un appel de méthode plus rapide que l'approche NSDate.

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

10
Tyler
// Timestamp after converting to milliseconds.

NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];
8
Fatima Arshad

J'avais besoin d'un objet NSNumber contenant le résultat exact de [[NSDate date] timeIntervalSince1970]. Comme cette fonction a été appelée à plusieurs reprises et que je n'avais pas vraiment besoin de créer un objet NSDate, les performances n'étaient pas excellentes.

Donc, pour obtenir le format que me donnait la fonction originale, essayez ceci:

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

Ce qui devrait vous donner exactement le même résultat que [[NSDate date] timeIntervalSince1970]

7
mmackh

Essaye ça :

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;

Dans cet exemple, dateWithTimeIntervalSince1970 est utilisé en combinaison avec le formateur @ "AAAA-MM-jj HH: mm: ss.SSS" qui renverra la date avec l'année, le mois, le jour et l'heure avec les heures, les minutes, les secondes et les millisecondes. . Voir l'exemple: "2015-12-02 04: 43: 15.008". J'ai utilisé le NSString pour être sûr que le format sera déjà écrit.

4
ΩlostA

CFAbsoluteTimeGetCurrent ()

Le temps absolu est mesuré en secondes par rapport à la date de référence absolue du 1er janvier 2001 à 00:00:00 GMT. Une valeur positive représente une date après la date de référence, une valeur négative représente une date antérieure. Par exemple, l'heure absolue -32940326 équivaut au 16 décembre 1999 à 17:54:34. Des appels répétés à cette fonction ne garantissent pas des résultats en augmentation monotone. L'heure système peut diminuer en raison de la synchronisation avec des références de temps externes ou d'un changement explicite de l'horloge par l'utilisateur.

4
Inder Kumar Rathore

Ceci est fondamentalement la même réponse que celle postée par @TristanLorach, juste recodée pour Swift 3:

   /// Method to get Unix-style time (Java variant), i.e., 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)
   }
4
RenniePet
 func currentmicrotimeTimeMillis() -> Int64{
let nowDoublevaluseis = NSDate().timeIntervalSince1970
return Int64(nowDoublevaluseis*1000)

}

2
Softlabsindia

C'est ce que j'ai utilisé pour Swift

var date = NSDate()
let currentTime = Int64(date.timeIntervalSince1970 * 1000)

print("Time in milliseconds is \(currentTime)")

a utilisé ce site pour vérifier l'exactitude http://currentmillis.com/

1
DG7
let timeInMiliSecDate = Date()
let timeInMiliSec = Int (timeInMiliSecDate.timeIntervalSince1970 * 1000)
print(timeInMiliSec)
0
lazyTank
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];
0
PANKAJ VERMA

[NSDate timeIntervalSinceReferenceDate] est une autre option, si vous ne souhaitez pas inclure le framework Quartz. Il retourne un double, représentant les secondes.

0
Chris