it-swarm.com.de

iPhone: Wie bekomme ich aktuelle Millisekunden?

Wie kann ich die aktuelle Systemzeit in Millisekunden ermitteln?

203
phil
[[NSDate date] timeIntervalSince1970];

Es gibt die Anzahl der Sekunden seit Epoche als Double zurück. Ich bin fast sicher, dass Sie aus dem gebrochenen Teil auf die Millisekunden zugreifen können.

264
codelogic

Wenn Sie dies für das relative Timing (z. B. für Spiele oder Animationen) verwenden möchten, verwende ich lieber CACurrentMediaTime ()

double CurrentTime = CACurrentMediaTime();

Welches ist der empfohlene Weg? NSDate greift auf die vernetzte Synchrontaktuhr zurück und wird gelegentlich bei der Synchronisierung mit dem Netzwerk hiccup.

Gibt die aktuelle absolute Zeit in Sekunden zurück.


Wenn Sie only als Dezimalteil verwenden möchten (wird häufig beim Synchronisieren von Animationen verwendet),

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

Ich habe alle anderen Antworten auf einem iPhone 4S und iPad 3 (Release Builds) getestet. CACurrentMediaTime hat den geringsten Overhead mit einem kleinen Vorsprung. timeIntervalSince1970 ist viel langsamer als die anderen, wahrscheinlich aufgrund von NSDate Instantiation-Overhead, obwohl dies für viele Anwendungsfälle keine Rolle spielt.

Ich würde CACurrentMediaTime empfehlen, wenn Sie den geringsten Overhead wünschen und es Ihnen nichts ausmacht, die Quartz Framework-Abhängigkeit hinzuzufügen. 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
90
darrinm

In Swift können wir eine Funktion erstellen und wie folgt vorgehen

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

var currentTime = getCurrentMillis()

Obwohl es in Swift 3.0 funktioniert, können wir die Date-Klasse anstelle von NSDate in 3.0 ändern und verwenden. 

Swift 3.0

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

var currentTime = getCurrentMillis()
44

Bisher fand ich gettimeofday eine gute Lösung für iOS (iPad), wenn Sie eine Intervallauswertung durchführen möchten (zB Framerate, Timing eines Renderingframes ...):

#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

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)
    }
14
svmrajesh

Es kann hilfreich sein, sich mit CodeTimestamps vertraut zu machen, die einen Wrapper für mach-basierte Timing-Funktionen bereitstellen. Dadurch erhalten Sie Timing-Daten im Nanosekundenbereich - 1000000x genauer als Millisekunden. Ja, eine Million Mal genauer. (Die Präfixe sind milli, micro, nano und jeweils 1000x genauer als die letzten.) Auch wenn Sie CodeTimestamps nicht benötigen, lesen Sie den Code (es ist Open Source), um zu sehen, wie er die Timing-Daten mit mach abruft. Dies ist nützlich, wenn Sie mehr Genauigkeit benötigen und einen schnelleren Methodenaufruf als den Ansatz von NSDate wünschen.

http://de.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

Ich brauchte ein NSNumber-Objekt, das das genaue Ergebnis von [[NSDate date] timeIntervalSince1970] enthält. Da diese Funktion viele Male aufgerufen wurde und ich nicht unbedingt ein NSDate-Objekt erstellen musste, war die Leistung nicht besonders gut.

Um das Format zu erhalten, das mir die ursprüngliche Funktion gegeben hat, versuchen Sie folgendes:

#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 wie [[NSDate date] timeIntervalSince1970] geben

7
mmackh

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 aus dem Formatierer @ "JJJJ-MM-TT HH: mm: ss.SSS" verwendet, das 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 sicherzugehen, dass das Format zuvor geschrieben wurde.

4
ΩlostA

CFAbsoluteTimeGetCurrent ()

Die absolute Zeit wird in Sekunden relativ zum absoluten Referenzdatum vom 1. Januar 2001 um 00:00:00 GMT gemessen. Ein positiver Wert steht für ein Datum nach dem Referenzdatum, ein negativer Wert für ein Datum davor. Zum Beispiel 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 Synchronisierung mit externen Zeitreferenzen oder aufgrund einer expliziten Benutzeränderung der Uhr verringern.

4

Dies ist im Grunde die gleiche Antwort wie von @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)
   }
4
RenniePet
 func currentmicrotimeTimeMillis() -> Int64{
let nowDoublevaluseis = NSDate().timeIntervalSince1970
return Int64(nowDoublevaluseis*1000)

}

2
Softlabsindia

Das habe ich für Swift verwendet

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

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

nutzte diese Site, um die Genauigkeit zu überprüfen 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] ist eine weitere Option, wenn Sie das Quartz-Framework nicht verwenden möchten. Es gibt ein Doppel zurück, das Sekunden darstellt.

0
Chris