Antworten:
[[NSDate date] timeIntervalSince1970];
Es gibt die Anzahl der Sekunden seit der Epoche als Doppel zurück. Ich bin mir fast sicher, dass Sie vom Bruchteil aus auf die Millisekunden zugreifen können.
[NSDate timeIntervalSinceReferenceDate]
ist günstiger. (Obwohl es auf eine andere "Epoche" verweist - wenn Sie 1970 wollen, fügen Sie die Konstante hinzu NSTimeIntervalSince1970
.)
Wenn Sie dies für das relative Timing verwenden möchten ( zum Beispiel für Spiele oder Animationen), würde ich lieber CACurrentMediaTime () verwenden.
double CurrentTime = CACurrentMediaTime();
Welches ist der empfohlene Weg; NSDate
Zieht von der vernetzten Synchronisierungsuhr und schluckt gelegentlich, wenn sie erneut mit dem Netzwerk synchronisiert wird.
Es gibt die aktuelle absolute Zeit in Sekunden zurück.
Wenn Sie nur den Dezimalteil möchten (häufig beim Synchronisieren von Animationen verwendet),
let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)
Ich habe alle anderen Antworten auf einem iPhone 4S und iPad 3 (Release Builds) verglichen. CACurrentMediaTime
hat mit geringem Abstand den geringsten Overhead. timeIntervalSince1970
ist weitaus langsamer als die anderen, wahrscheinlich aufgrund des NSDate
Instanziierungsaufwands, obwohl dies für viele Anwendungsfälle möglicherweise keine Rolle spielt.
Ich würde empfehlen, CACurrentMediaTime
wenn Sie den geringsten Overhead wünschen und die Quartz Framework-Abhängigkeit nicht hinzufügen möchten. Oder gettimeofday
wenn Portabilität für Sie Priorität hat.
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
NSTimeIntervalSince1970
Makro, das am schnellsten ist.
NSTimeIntervalSince1970
ist eine Konstante, die die Sekunden zwischen dem 01.01.1970 und dem "Referenzdatum" (dh 01.01.2001) beschreibt. Sie ist also immer gleich 978307200
In Swift können wir eine Funktion erstellen und wie folgt vorgehen
func getCurrentMillis()->Int64{
return Int64(NSDate().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
Obwohl seine adaequat in Swift 3.0 , aber wir können das ändern und verwenden Date
Klasse statt NSDate
in 3,0
Swift 3.0
func getCurrentMillis()->Int64 {
return Int64(Date().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
Bisher habe ich gettimeofday
eine gute Lösung für iOS (iPad) gefunden, wenn Sie eine Intervallauswertung durchführen möchten (z. B. Framerate, Timing eines Rendering-Frames ...):
#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL);
long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);
Um Millisekunden für das aktuelle Datum zu erhalten.
Swift 4+:
func currentTimeInMilliSeconds()-> Int
{
let currentDate = Date()
let since1970 = currentDate.timeIntervalSince1970
return Int(since1970 * 1000)
}
Swift 2
let seconds = NSDate().timeIntervalSince1970
let milliseconds = seconds * 1000.0
Swift 3
let currentTimeInMiliseconds = Date().timeIntervalSince1970.milliseconds
TimeInterval
aka Double
hat keine Millisekunden-Eigenschaft. Date().timeIntervalSince1970 * 1000
Es kann nützlich sein, sich mit CodeTimestamps vertraut zu machen, die einen Wrapper für machbasierte Timing-Funktionen bieten. Auf diese Weise erhalten Sie Zeitdaten mit einer Auflösung von Nanosekunden - 1000000x genauer als Millisekunden. Ja, millionenfach genauer. (Die Präfixe sind Milli, Micro, Nano, jeweils 1000x genauer als die letzten.) Auch wenn Sie keine CodeTimestamps benötigen, lesen Sie den Code (Open Source), um zu sehen, wie sie mach verwenden, um die Timing-Daten abzurufen. Dies ist nützlich, wenn Sie mehr Präzision benötigen und einen schnelleren Methodenaufruf als den NSDate-Ansatz wünschen.
http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/
-fno-objc-arc
wenn Sie ARC verwenden :)
// Timestamp after converting to milliseconds.
NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];
Ich brauchte ein NSNumber
Objekt mit dem genauen Ergebnis von [[NSDate date] timeIntervalSince1970]
. Da diese Funktion viele Male aufgerufen wurde und ich kein NSDate
Objekt erstellen musste , war die Leistung nicht besonders gut.
Versuchen Sie Folgendes, um das Format zu erhalten, das mir die ursprüngliche Funktion gegeben hat:
#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001;
Welches sollte Ihnen genau das gleiche Ergebnis geben wie [[NSDate date] timeIntervalSince1970]
Die absolute Zeit wird in Sekunden relativ zum absoluten Referenzdatum vom 1. Januar 2001 00:00:00 GMT gemessen. Ein positiver Wert steht für ein Datum nach dem Stichtag, ein negativer Wert für ein Datum davor. Beispielsweise entspricht die absolute Zeit -32940326 dem 16. Dezember 1999 um 17:54:34 Uhr. Wiederholte Aufrufe dieser Funktion garantieren keine monoton steigenden Ergebnisse. Die Systemzeit kann sich aufgrund der Synchronisation mit externen Zeitreferenzen oder aufgrund einer expliziten Änderung der Uhr durch den Benutzer verringern.
Versuche dies :
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;
In diesem Beispiel wird dateWithTimeIntervalSince1970 in Kombination mit dem Formatierer @ "JJJJ-MM-TT HH: mm: ss.SSS" verwendet, der das Datum mit Jahr, Monat, Tag und die Uhrzeit mit Stunden, Minuten, Sekunden und Millisekunden zurückgibt . Siehe das Beispiel: "2015-12-02 04: 43: 15.008". Ich habe den NSString verwendet, um sicherzustellen, dass das Format zuvor geschrieben wurde.
Dies ist im Grunde die gleiche Antwort wie bei @TristanLorach, die gerade für Swift 3 neu codiert wurde:
/// 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)
}
func currentmicrotimeTimeMillis() -> Int64{
let nowDoublevaluseis = NSDate().timeIntervalSince1970
return Int64(nowDoublevaluseis*1000)
}}
Das habe ich für Swift verwendet
var date = NSDate()
let currentTime = Int64(date.timeIntervalSince1970 * 1000)
print("Time in milliseconds is \(currentTime)")
hat diese Website verwendet, um die Richtigkeit zu überprüfen http://currentmillis.com/
let timeInMiliSecDate = Date()
let timeInMiliSec = Int (timeInMiliSecDate.timeIntervalSince1970 * 1000)
print(timeInMiliSec)
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];