Ceea ce este cel mai bun mod pentru a obține ora curentă a sistemului de milisecunde?
Daca're în căutarea de acest lucru pentru sincronizare relativă (de exemplu, pentru jocuri sau animație) am'd folosi mai degrabă CACurrentMediaTime()
double CurrentTime = CACurrentMediaTime();
Care este modul recomandat; NSDate
atrage de la rețea synch-ceas și ocazional sughiț atunci când re-sincronizare împotriva rețea.
Se revine la curent absolută de timp, în secunde.
Dacă vrei doar pentru partea zecimală (adesea folosit atunci când sincronizarea animații),
let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)
Am referință, toate celelalte răspunsuri pe un iPhone 4S si iPad 3 (eliberarea construiește). CACurrentMediaTime
are puțin deasupra capului cu o marjă mică. timeIntervalSince1970
este mult mai lent decât altele, probabil din cauza NSDate
instanțierea deasupra capului, deși poate nu contează pentru multe cazuri de utilizare.
Am'd recomand CACurrentMediaTime dacă vrei puțin deasupra capului și don't mintea adăugarea de Cuarț Cadru de dependență. Sau
gettimeofday dacă portabilitatea este o prioritate pentru tine.
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
În Swift putem face o funcție și face după cum urmează
func getCurrentMillis()->Int64{
return Int64(NSDate().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
Deși bine lucru, în Swift 3.0 dar putem modifica și de a folosi "Data" de clasă în loc de `NSDate în 3.0
Swift 3.0
func getCurrentMillis()->Int64 {
return Int64(Date().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
Până acum am găsit gettimeofday o soluție bună pe iOS (iPad), atunci când doriți să efectuați un interval de evaluare (să zicem, framerate-ul, calendarul de o redare cadru...) :
#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL);
long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);
Pentru a obține milisecunde pentru data curentă.
Swift 4+:
func currentTimeInMilliSeconds()-> Int
{
let currentDate = Date()
let since1970 = currentDate.timeIntervalSince1970
return Int(since1970 * 1000)
}
Poate fi util să știți despre CodeTimestamps, care oferă un înveliș în jurul valorii de mach bazate pe funcțiile de temporizare. Acest lucru vă oferă o nanosecundă-rezoluție de sincronizare a datelor - 1000000x mai precis decât milisecunde. Da, de un milion de ori mai precise. (Prefixele sunt mili, micro, nano, fiecare 1000x mai precise decât ultima.) Chiar dacă tu nu't nevoie de CodeTimestamps, a verifica afară de cod (it's open source) pentru a vedea cum se folosesc mach pentru a obține date de sincronizare. Acest lucru va fi util atunci când aveți nevoie de mai multă precizie și doresc o metoda mai rapida de apel decât NSDate abordare.
http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/
Am nevoie de un NSNumber
obiect care conține rezultatul exact al [[NSDate data] timeIntervalSince1970]
. Când această funcție a fost numit de multe ori și m-am't într-adevăr nevoie pentru a crea o NSDate
obiect, performanta nu a fost mare.
Deci, pentru a obține formatul că funcția inițială a fost oferindu-mi, încercați acest lucru:
#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001;
Care ar trebui să-ți dea același rezultat ca [[NSDate data] timeIntervalSince1970]
Încercați acest lucru :
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;
În acest exemplu, dateWithTimeIntervalSince1970 este folosit în combinație de formatare @"YYYY-MM-dd HH:mm:ss.SSS", care va reveni data cu anul, luna, ziua și ora cu ore, minute, secunde și milisecunde. A se vedea de exemplu : "2015-12-02 04:43:15.008". Am folosit NSString pentru a fi sigur că formatul va fi a scris înainte.
Absolută timpul se măsoară în secunde raport cu referință absolută data de 1 ianuarie 2001 00:00:00 GMT. O valoare pozitivă reprezintă data de la data de referință, o valoare negativă reprezintă o dată înainte. De exemplu, valoarea absolută a timpului -32940326 este echivalent cu 16 decembrie, 1999 at 17:54:34. Apelurile repetate la această funcție nu garantează monoton crescătoare rezultatele. Sistemul de timp poate scădea din cauza sincronizarea cu timp externă referințe sau din cauza unei explicit de utilizator schimbare de ceas.
Acest lucru este, practic, același răspuns postat de @TristanLorach, doar recoded pentru 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)
}
Asta este ceea ce am folosit pentru Swift
var date = NSDate()
let currentTime = Int64(date.timeIntervalSince1970 * 1000)
print("Time in milliseconds is \(currentTime)")
folosit acest site pentru a verifica exactitatea http://currentmillis.com/
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];