2015-10-25 2 views
6

sto cercando di studiare NSDate classe Swift 2.timeIntervalSinceReferenceDate vs timeIntervalSince1970 vs timeIntervalSinceNow

ho scoperto che ogni oggetto NSDate ha tre proprietà, che sono:

  1. timeIntervalSinceReferenceDate
  2. timeIntervalSince1970
  3. timeIntervalSinceNow

Un po 'di confusione per me. Non riuscivo a capire l'interpretazione di loro anche se so che rappresentano i secondi.

ho fatto questo codice:

let whatISThis = NSDate(timeIntervalSinceReferenceDate: NSTimeInterval(60)) 

Va bene ho avuto una data, ma che cos'è? qual è la differenza tra queste tre proprietà?

risposta

22

timeIntervalSinceReferenceDate è il numero di secondi dal 1 ° Gennaio 2001: 00:00 (metà notte)

timeIntervalSince1970 è il numero di secondi dal 1 ° Gennaio 1970, 00:00 (metà notte)

timeIntervalSinceNow è il numero di secondi dal momento

voglio elencare questi esempi:

let s0 = NSDate(timeIntervalSinceReferenceDate: NSTimeInterval(0)) // it means give me the time that happens after January,1st, 2001, 12:00 am by zero seconds 
print("\(s0)") //2001-01-01 00:00:00 

let s60 = NSDate(timeIntervalSinceReferenceDate: NSTimeInterval(60)) //it means give me the time that happens after January, 1st, 2001, 12:00 am by **60 seconds** 
print("\(s60)") //2001-01-01 00:01:00 

let s2 = NSDate(timeIntervalSince1970: NSTimeInterval(0)) // it means give me the time that happens after January, 1st, 1970 12:00 am by **zero** seconds 
print("\(s2)") //1970-01-01 00:00:00 

let s3 = NSDate() // it means the current time 
print("\(s3)")//2015-10-25 14:12:40 

let s4 = NSDate(timeIntervalSinceNow: NSTimeInterval(60)) //it means one minute (60 seconds) after the current time 
print("\(s4)") //2015-10-25 14:13:40 

let s5 = NSDate(timeIntervalSinceNow: NSTimeInterval(-60)) // it means one minute (60 seconds) before the current time 
print("\(s5)") //2015-10-25 14:11:40 

let sd = NSDate(timeIntervalSinceReferenceDate: NSTimeInterval(60)) // it means one minute after the reference time (January, 1st, 1970: 12:00 am) 
print("\(sd)") //2001-01-01 00:01:00 

E, naturalmente, se si dispone di un oggetti NSDate, si può prendere tutte queste proprietà semplicemente ...

let sNow = NSDate() 
sNow.timeIntervalSinceReferenceDate 
sNow.timeIntervalSinceNow 
sNow.timeIntervalSince1970 
0

Potete trovare gli intervalli di tempo tra gli oggetti di data con
- timeIntervalSinceDate:

Queste tre proprietà sono scorciatoie per trovare la stessa cosa con altri oggetti di data di convenienza.

  1. timeIntervalSince1970 - 1 gennaio 1970 alle 12:00 GMT.
  2. timeIntervalSinceReferenceDate - 1 gennaio 2001, alle 12:00 GMT.
  3. timeIntervalSinceNow - data e ora correnti.
4

William ha spiegato bene la differenza tra gli inizializzatori. (Votato)

NSDate ha anche proprietà che ti permettono di chiedere una data per darti degli intervalli di tempo. Ne parlerò tra un minuto.

Primo background: i metodi timeIntervalSince1970 e timeIntervalSinceReferenceDate utilizzano una diversa "epoca di data" o una data che è considerata la "data zero" (la data con un valore numerico pari a zero).

timeIntervalSince1970 utilizza la data epoca che è lo standard in UNIX: mezzanotte del 1 gennaio 1970 in GMT. Questa è anche la data di epoca standard per le date su Internet.

timeIntervalSinceReferenceDate utilizza la data di epoca Mac OS`/iOS: mezzanotte del 1 ° gennaio 2001. È possibile calcolare facilmente un offset costante tra queste 2 date di riferimento e convertirle tra loro mediante addizione/sottrazione.

Oltre ai metodi di avvio che avete parlato, NSDate ha proprietà che ti danno un valore che rappresenta il numero di secondi dal momento che una certa data di riferimento:

var timeIntervalSinceReferenceDate: NSTimeInterval 
var timeIntervalSince1970: NSTimeInterval 

E 'di confusione perché i nomi di le proprietà e i nomi dei metodi init appaiono identici in Swift. I metodi init sono chiamati un po 'più chiaramente in Objective-C:

+ (instancetype _Nonnull)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds 

+ (instancetype _Nonnull)dateWithTimeIntervalSince1970:(NSTimeInterval)seconds 

Di solito trovo metodo di denominazione di Swift per essere più pulita di Objective-C di, ma i metodi init può essere un'eccezione.