Aktuelles Datum in Millisekunden abrufen

Antworten:

103

Es gibt verschiedene Möglichkeiten, dies zu tun, obwohl mein persönlicher Favorit ist:

CFAbsoluteTime timeInSeconds = CFAbsoluteTimeGetCurrent();

Weitere Informationen zu dieser Methode finden Sie hier . Sie können auch ein NSDate-Objekt erstellen und Zeit abrufen, indem Sie timeIntervalSince1970 aufrufen, das die Sekunden seit dem 1.1.1970 zurückgibt:

NSTimeInterval timeInSeconds = [[NSDate date] timeIntervalSince1970];

Und in Swift:

let timeInSeconds: TimeInterval = Date().timeIntervalSince1970
Pawel
quelle
4
Ich versuche den folgenden Code zu verwenden NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate);
Siva
2
Das Problem liegt in der NSLog-Anweisung. NSTimeInterval ist ein typdefiniertes Double. Daher sollten Sie% f anstelle von% d verwenden.
Pawel
55
[[NSDate date] timeIntervalSince1970] gibt ein NSTimeInterval zurück, das eine Dauer in Sekunden und nicht in Millisekunden ist.
Erik van der Neut
12
Beachten Sie, dass CFAbsoluteTimeGetCurrent()die Uhrzeit relativ zum Referenzdatum zurückgegeben wird Jan 1 2001 00:00:00 GMT. Nicht, dass in der Frage ein Referenzdatum angegeben wurde, aber beachten Sie, dass dies kein UNIX-Zeitstempel ist.
nyi
2
[[NSDate date] timeIntervalSince1970] gibt die Zeit in Sekunden und nicht in Millisekunden zurück.
SAPLogix
61

Das NSTimeInterval direkt auf einen langen Überlauf für mich zu übertragen, also musste ich stattdessen auf einen langen Long umstellen.

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

Das Ergebnis ist ein 13-stelliger Zeitstempel wie unter Unix.

wileymab
quelle
4
Dies gibt nicht die tatsächlichen Millisekunden zurück, da timeIntervalSince1970 das Intervall in Sekunden zurückgibt, sodass wir nicht die gewünschte Millis-Genauigkeit haben.
Danpe
8
Die timeIntervalSince1970 Methode kehrt zwar bei den Sekunden der gesamten Zahl zurück, enthält jedoch doubleauch die Bruchsekunde, die arithmetisch in Millisekunden umgewandelt werden kann. Daher die Multiplikation mit 1000.
wileymab
@wileymap Ja, du hast recht. Ich habe es später herausgefunden
Danpe
2
long long? Diese Sprache ist so seltsam
user924
@ user924 Konnte nicht mehr zustimmen. Deshalb habe ich aufgehört, es zu schreiben. ;)
wileymab
10
NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000);
Eimantas
quelle
Ich versuche, den folgenden Code zu verwenden: NSTimeInterval milisecondedDate = ([[NSDate date] timeIntervalSince1970] * 1000); NSLog (@ "didReceiveResponse ----% d", milisecondedDate); - aber es zeigt den Wert im negativen Wert - wie ResponseTIME ---- 556610175 ResponseTIME ---- -1548754395
Siva
1
Versuchen Sie,% f Platzhalter anstelle von% d zu verwenden. Wenn das nicht hilft - entfernen Sie die Multiplikation mit 1000
Eimantas
@ Eimantas, Wenn ich versuche,% f zu verwenden ... Ich erhalte Zeit wie folgt Antwortzeit = 1306494959011.239014 Antwortzeit = 1306494910724.744141 Wenn es ms ist, beträgt die oben angegebene Zeit mehr als eine Stunde.
Siva
Das aktuelle Datum ist das Zeitintervall in Sekunden seit 1970. Sie haben nichts über das Referenzdatum erwähnt.
Eimantas
Ich werde nur das aktuelle Datum Zeitintervall nehmen
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
quelle
7

Sie können dies einfach tun:

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

Dies gibt einen Wert in Millisekunden zurück. Wenn Sie also den resultierenden Wert mit 1000 multiplizieren (wie von meinen Eimantas vorgeschlagen), wird der lange Typ überlaufen und es wird ein negativer Wert angezeigt.

Wenn ich diesen Code jetzt gerade ausführe, führt dies zu

currentTime = 1357234941

und

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

@JavaZava Ihre Lösung ist gut, aber wenn Sie einen 13-stelligen Wert haben möchten, der mit der Zeitstempelformatierung in Java oder JavaScript (und anderen Sprachen) übereinstimmt, verwenden Sie diese Methode:

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;

oder (wenn Sie eine Zeichenfolge benötigen):

NSString *timestampString = [NSString stringWithFormat:@"%ld%d",digits ,decimalDigits];
Itai Hanski
quelle
NSString * timestampString = [NSString stringWithFormat: @ "% ld% 03d", Ziffern, Dezimalstellen]; ist eigentlich richtig. In Ihrem Fall führt ein decimalDigits-Wert unter 100 zu einem falschen Ergebnis.
PANKAJ VERMA
4

Wie bereits erwähnt, gibt [[NSDate date] timeIntervalSince1970] ein NSTimeInterval zurück. Dies ist eine Dauer in Sekunden und nicht in Millisekunden.

Sie können https://currentmillis.com/ besuchen, um zu sehen, wie Sie in die gewünschte Sprache gelangen können. Hier ist die 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

Für das objektive CI hat CI Folgendes getan, um es auszudrucken -

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

Hoffentlich hilft das.

Aniket Thakur
quelle
1

Konvertieren Sie den NSTimeInterval milisecondedDateWert in nsstringund danach in int.

Vikash
quelle
0

Sie können die folgenden Methoden verwenden, um das aktuelle Datum in Millisekunden abzurufen.

[[NSDate date] timeIntervalSince1970];

ODER

double CurrentTime = CACurrentMediaTime(); 

Quelle: iPhone: Wie erhalte ich aktuelle Millisekunden?

Muhammad Nabeel Arif
quelle
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
quelle
0

Verwenden Sie diese Option, um die Zeit in Millisekunden abzurufen (long)(NSTimeInterval)([[NSDate date] timeIntervalSince1970]).

Tanvi Jain
quelle
0

Eine Verlängerung am Datum ist wahrscheinlich der beste Weg, dies zu tun.

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