Obtenir la date actuelle en millisecondes

Réponses:

103

Il y a plusieurs façons de le faire, bien que ma préférée soit:

CFAbsoluteTime timeInSeconds = CFAbsoluteTimeGetCurrent();

Vous pouvez en savoir plus sur cette méthode ici . Vous pouvez également créer un objet NSDate et obtenir l'heure en appelant timeIntervalSince1970 qui renvoie les secondes depuis le 1/1/1970:

NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];

Et dans Swift:

let timeInSeconds: TimeInterval = Date().timeIntervalSince1970
Pawel
la source
4
Im essayant ce code suivant NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", millisecondedDate);
siva
2
Le problème vient de l'instruction NSLog. NSTimeInterval est un double typedefed. Vous devez donc utiliser% f au lieu de% d.
Pawel
55
[[NSDate date] timeIntervalSince1970] renvoie un NSTimeInterval, qui est une durée en secondes et non en milli-secondes.
Erik van der Neut
12
Notez que CFAbsoluteTimeGetCurrent()renvoie l'heure par rapport à la date de référence Jan 1 2001 00:00:00 GMT. Non pas qu'une date de référence ait été donnée dans la question, mais sachez qu'il ne s'agit pas d'un horodatage UNIX.
nyi le
2
[[NSDate date] timeIntervalSince1970] renvoie l'heure en secondes et non en millisecondes.
SAPLogix
61

Lancer le NSTimeInterval directement sur un long débordé pour moi, donc à la place j'ai dû le lancer sur un long long.

long long milliseconds = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0);

Le résultat est un horodatage à 13 chiffres comme sous Unix.

wileymab
la source
4
Cela ne renverra pas les millisecondes réelles car timeIntervalSince1970 renvoie l'intervalle en secondes, nous n'aurons donc pas la précision souhaitée en millisecondes.
Danpe
9
La timeIntervalSince1970 méthode renvoie les secondes sur le nombre entier, mais c'est un doublequi inclut également la fraction de seconde qui peut être convertie arithmétiquement en millisecondes. D'où la multiplication par 1000.
wileymab
@wileymap Oui, vous avez raison. Je l'ai compris plus tard
Danpe
2
long long? cette langue est si bizarre
user924
@ user924 Je ne peux pas être plus d'accord. C'est pourquoi j'ai arrêté de l'écrire. ;)
wileymab
10
NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000);
Eimantas
la source
Im essayant ce code suivant NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", millisecondedDate); - mais il montre la valeur en valeur négative - comme ResponseTIME ---- 556610175 ResponseTIME ---- -1548754395
siva
1
essayez d'utiliser l'espace réservé% f au lieu de% d. Si cela n'aide pas - supprimez la multiplication par 1000
Eimantas
@ Eimantas, lorsque j'essaie d'utiliser% f ... Im obtenant le temps comme suit Temps de réponse = 1306494959011.239014 Temps de réponse = 1306494910724.744141 Si c'est ms, le temps ci-dessus est supérieur à une heure.
siva
La date actuelle est l'intervalle de temps en secondes depuis 1970. Vous n'avez rien mentionné sur la date de référence.
Eimantas
Je ne prendrai que l'intervalle de date actuel
siva
8
extension NSDate {

    func toMillis() -> NSNumber {
        return NSNumber(longLong:Int64(timeIntervalSince1970 * 1000))
    }

    static func fromMillis(millis: NSNumber?) -> NSDate? {
        return millis.map() { number in NSDate(timeIntervalSince1970: Double(number) / 1000)}
    }

    static func currentTimeInMillis() -> NSNumber {
        return NSDate().toMillis()
    }
}
Siamaster
la source
7

Vous pouvez simplement faire ceci:

long currentTime = (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]);

cela renverra une valeur en millisecondes, donc si vous multipliez la valeur résultante par 1000 (comme suggéré mes Eimantas), vous déborderez le type long et cela entraînera une valeur négative.

Par exemple, si j'exécute ce code maintenant, cela entraînera

currentTime = 1357234941

et

currentTime /seconds / minutes / hours / days = years
1357234941 / 60 / 60 / 24 / 365 = 43.037637652207
JavaZava
la source
5

@JavaZava votre solution est bonne, mais si vous voulez avoir une valeur longue de 13 chiffres pour être cohérente avec le formatage de l'horodatage en Java ou JavaScript (et dans d'autres langages), utilisez cette méthode:

NSTimeInterval time = ([[NSDate date] timeIntervalSince1970]); // returned as a double
long digits = (long)time; // this is the first 10 digits
int decimalDigits = (int)(fmod(time, 1) * 1000); // this will get the 3 missing digits
long timestamp = (digits * 1000) + decimalDigits;

ou (si vous avez besoin d'une chaîne):

NSString *timestampString = [NSString stringWithFormat:@"%ld%d",digits ,decimalDigits];
Itai Hanski
la source
NSString * timestampString = [NSString stringWithFormat: @ "% ld% 03d", chiffres, decimalDigits]; est correct en fait. Dans votre cas, si la valeur de decimalDigits est inférieure à 100, le résultat sera incorrect.
PANKAJ VERMA
4

Comme indiqué précédemment, [[NSDate date] timeIntervalSince1970] renvoie un NSTimeInterval, qui est une durée en secondes et non en milli-secondes.

Vous pouvez visiter https://currentmillis.com/ pour voir comment vous pouvez obtenir dans la langue que vous désirez. Voici la liste -

ActionScript    (new Date()).time
C++ std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()
C#.NET  DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
Clojure (System/currentTimeMillis)
Excel / Google Sheets*  = (NOW() - CELL_WITH_TIMEZONE_OFFSET_IN_HOURS/24 - DATE(1970,1,1)) * 86400000
Go / Golang time.Now().UnixNano() / 1000000
Hive*   unix_timestamp() * 1000
Java / Groovy / Kotlin  System.currentTimeMillis()
Javascript  new Date().getTime()
MySQL*  UNIX_TIMESTAMP() * 1000
Objective-C (long long)([[NSDate date] timeIntervalSince1970] * 1000.0)
OCaml   (1000.0 *. Unix.gettimeofday ())
Oracle PL/SQL*  SELECT (SYSDATE - TO_DATE('01-01-1970 00:00:00', 'DD-MM-YYYY HH24:MI:SS')) * 24 * 60 * 60 * 1000 FROM DUAL
Perl    use Time::HiRes qw(gettimeofday); print gettimeofday;
PHP round(microtime(true) * 1000)
PostgreSQL  extract(epoch FROM now()) * 1000
Python  int(round(time.time() * 1000))
Qt  QDateTime::currentMSecsSinceEpoch()
R*  as.numeric(Sys.time()) * 1000
Ruby    (Time.now.to_f * 1000).floor
Scala   val timestamp: Long = System.currentTimeMillis
SQL Server  DATEDIFF(ms, '1970-01-01 00:00:00', GETUTCDATE())
SQLite* STRFTIME('%s', 'now') * 1000
Swift*  let currentTime = NSDate().timeIntervalSince1970 * 1000
VBScript / ASP  offsetInMillis = 60000 * GetTimeZoneOffset()
WScript.Echo DateDiff("s", "01/01/1970 00:00:00", Now()) * 1000 - offsetInMillis + Timer * 1000 mod 1000

Pour l'objectif CI a fait quelque chose comme ci-dessous pour l'imprimer -

long long mills = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0);
 NSLog(@"Current date %lld", mills);

Hopw que cela aide.

Aniket Thakur
la source
1

Cconvertir la NSTimeInterval milisecondedDatevaleur nsstringet ensuite la convertir en int.

Vikash
la source
0
- (void)GetCurrentTimeStamp
    {
        NSDateFormatter *objDateformat = [[NSDateFormatter alloc] init];
        [objDateformat setDateFormat:@"yyyy-MM-dd"];
        NSString    *strTime = [objDateformat stringFromDate:[NSDate date]];
        NSString    *strUTCTime = [self GetUTCDateTimeFromLocalTime:strTime];//You can pass your date but be carefull about your date format of NSDateFormatter.
        NSDate *objUTCDate  = [objDateformat dateFromString:strUTCTime];
        long long milliseconds = (long long)([objUTCDate timeIntervalSince1970] * 1000.0);

        NSString *strTimeStamp = [NSString stringWithFormat:@"%lld",milliseconds];
        NSLog(@"The Timestamp is = %@",strTimeStamp);
    }

 - (NSString *) GetUTCDateTimeFromLocalTime:(NSString *)IN_strLocalTime
    {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd"];
        NSDate  *objDate    = [dateFormatter dateFromString:IN_strLocalTime];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        NSString *strDateTime   = [dateFormatter stringFromDate:objDate];
        return strDateTime;
    }
Vicky
la source
0

Utilisez ceci pour obtenir l'heure en millisecondes (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]).

Tanvi Jain
la source
0

Une prolongation de date est probablement le meilleur moyen d'y parvenir.

extension NSDate {
    func msFromEpoch() -> Double {
        return self.timeIntervalSince1970 * 1000
    }
}
Joslinm
la source