Risposte:
[[NSDate date] timeIntervalSince1970];
Restituisce il numero di secondi dall'epoca in doppio. Sono quasi sicuro che puoi accedere ai millisecondi dalla parte frazionaria.
[NSDate timeIntervalSinceReferenceDate]
è più economico. (Anche se fa riferimento a una "epoca" diversa - se vuoi il 1970 aggiungi la costante NSTimeIntervalSince1970
.)
Se stai cercando di usarlo per i tempi relativi (ad esempio per giochi o animazioni) preferirei usare CACurrentMediaTime ()
double CurrentTime = CACurrentMediaTime();
Qual è il modo raccomandato; NSDate
attinge dall'orologio di sincronizzazione in rete e occasionalmente si verifica un singhiozzo quando si sincronizza nuovamente con la rete.
Restituisce il tempo assoluto corrente, in secondi.
Se desideri solo la parte decimale (spesso utilizzata durante la sincronizzazione di animazioni),
let ct = CACurrentMediaTime().truncatingRemainder(dividingBy: 1)
Ho confrontato tutte le altre risposte su un iPhone 4S e iPad 3 (build di rilascio). CACurrentMediaTime
ha il minimo sovraccarico di un piccolo margine. timeIntervalSince1970
è molto più lento degli altri, probabilmente a causa del NSDate
sovraccarico di istanza, anche se potrebbe non essere importante per molti casi d'uso.
Ti consiglierei CACurrentMediaTime
se desideri il minimo sovraccarico e non ti dispiace aggiungere la dipendenza Quartz Framework. O gettimeofday
se la portabilità è una priorità per te.
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
macro che è la più veloce.
NSTimeIntervalSince1970
è una costante che descrive i secondi tra il 1970-01-01 e la "data di riferimento" (cioè 2001-01-01), quindi è sempre uguale a 978307200
In Swift possiamo fare una funzione e fare come segue
func getCurrentMillis()->Int64{
return Int64(NSDate().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
Anche se funziona bene in Swift 3.0 ma possiamo modificare e usare la Date
classe invece che NSDate
in 3.0
Swift 3.0
func getCurrentMillis()->Int64 {
return Int64(Date().timeIntervalSince1970 * 1000)
}
var currentTime = getCurrentMillis()
Finora ho trovato gettimeofday
una buona soluzione su iOS (iPad), quando si desidera eseguire una valutazione dell'intervallo (ad esempio framerate, tempistica di un frame di rendering ...):
#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL);
long millis = (time.tv_sec * 1000) + (time.tv_usec / 1000);
Per ottenere millisecondi per la data corrente.
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
non ha proprietà in millisecondi. Date().timeIntervalSince1970 * 1000
Può essere utile conoscere CodeTimestamps, che forniscono un wrapper per le funzioni di temporizzazione basate su mach. Ciò fornisce dati di temporizzazione a risoluzione di nanosecondi: 1000000x più precisi dei millisecondi. Sì, un milione di volte più preciso. (I prefissi sono milli, micro, nano, ognuno 1000 volte più preciso dell'ultimo.) Anche se non hai bisogno di CodeTimestamps, controlla il codice (è open source) per vedere come usano mach per ottenere i dati di temporizzazione. Ciò sarebbe utile quando hai bisogno di maggiore precisione e desideri una chiamata di metodo più veloce rispetto all'approccio NSDate.
http://eng.pulse.me/line-by-line-speed-analysis-for-ios-apps/
-fno-objc-arc
se stai usando ARC :)
// Timestamp after converting to milliseconds.
NSString * timeInMS = [NSString stringWithFormat:@"%lld", [@(floor([date timeIntervalSince1970] * 1000)) longLongValue]];
Avevo bisogno di un NSNumber
oggetto contenente il risultato esatto di [[NSDate date] timeIntervalSince1970]
. Poiché questa funzione è stata chiamata molte volte e non ho davvero bisogno di creare un NSDate
oggetto, le prestazioni non sono state eccezionali.
Quindi per ottenere il formato che mi stava offrendo la funzione originale, prova questo:
#include <sys/time.h>
struct timeval tv;
gettimeofday(&tv,NULL);
double perciseTimeStamp = tv.tv_sec + tv.tv_usec * 0.000001;
Che dovrebbe darti lo stesso esatto risultato di [[NSDate date] timeIntervalSince1970]
Il tempo assoluto è misurato in secondi rispetto alla data di riferimento assoluta del 1 ° gennaio 2001 00:00:00 GMT. Un valore positivo rappresenta una data successiva alla data di riferimento, un valore negativo rappresenta una data precedente. Ad esempio, il tempo assoluto -32940326 è equivalente al 16 dicembre 1999 alle 17:54:34. Le chiamate ripetute a questa funzione non garantiscono risultati monotonicamente crescenti. L'ora del sistema può diminuire a causa della sincronizzazione con riferimenti temporali esterni o a causa di un esplicito cambio dell'orologio da parte dell'utente.
Prova questo :
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 questo esempio, dateWithTimeIntervalSince1970 viene utilizzato in combinazione con il formatter @ "AAAA-MM-gg HH: mm: ss.SSS" che restituirà la data con anno, mese, giorno e l'ora con ore, minuti, secondi e millisecondi . Vedi l'esempio: "2015-12-02 04: 43: 15.008". Ho usato NSString per essere sicuro che il formato sarà stato scritto prima.
Questa è sostanzialmente la stessa risposta pubblicata da @TristanLorach, appena modificata per 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)
}
func currentmicrotimeTimeMillis() -> Int64{
let nowDoublevaluseis = NSDate().timeIntervalSince1970
return Int64(nowDoublevaluseis*1000)
}
Questo è quello che ho usato per Swift
var date = NSDate()
let currentTime = Int64(date.timeIntervalSince1970 * 1000)
print("Time in milliseconds is \(currentTime)")
utilizzato questo sito per verificare l'accuratezza 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];