Objective-C setzt NSDate auf die aktuelle UTC

80

Gibt es eine einfache Möglichkeit, eine NSDatemit dem aktuellen UTC-Datum / der aktuellen UTC-Uhrzeit zu initiieren ?

Brodie
quelle
1
Würde [NSDate date]funktionieren? Ich bin mir nicht sicher, ob es UTC ist.
zneak
2
Es gibt kein NSDateUTC-Set, es ist keine Zeitzone zugeordnet.
Nick Forge
3
@MurraySagal Du bist falsch - NSDaterepräsentiert einen Moment in der Zeit (der Name NSDateist so etwas wie eine Fehlbezeichnung). Wenn Sie eine Zeit wie "den ersten Zeitpunkt des 1. Januar 2001" beschreiben, benötigen Sie eine Zeitzone, um den genauen Zeitpunkt zu ermitteln, über den Sie sprechen. Sobald der NSDateZeitpunkt erstellt ist, ist ihm jedoch keine Zeitzone zugeordnet.
Nick Forge
1
@NickForge Ein NSDate wird als "erster Zeitpunkt des 1. Januar 2001, GMT", eine bestimmte Zeit in einer bestimmten Zeitzone, erstellt. Diese Tatsache ist unveränderlich und von entscheidender Bedeutung für die Funktionsweise von Daten. Wenn wir uns in verschiedenen Zeitzonen befinden und dies im selben Moment protokolliert haben, ist NSLog(@"since1970= %f", [[NSDate date] timeIntervalSince1970]);das Ergebnis dasselbe. Warum? Weil es relativ zu einem bestimmten Zeitpunkt in einer bestimmten Zeitzone (GMT) ist, unabhängig davon, wo sich der Benutzer befindet. Die Tatsache, dass es relativ zu GMT ist, verschwindet nicht, sobald es erstellt wurde. Ohne diesen Anker wären die Daten beliebig.
Murray Sagal
2
@MurraySagal Sie haben beide auf unterschiedliche Weise Recht, aber Nick sagt zu Recht "Es gibt kein NSDateUTC-Set", weil Sie die Zeitzone eines nicht einstellen können NSDateund das falsch sagen es "hat eine Zeitzone". Es ist wahr, dass es relativ zu einer bestimmten Zeitzone definiert ist, aber zu sagen, dass es eine Zeitzone "hat", impliziert, dass die Zeitzone eine Eigenschaft von ist NSDate, und das ist nicht wahr.
Devios1

Antworten:

148

[NSDate date];

Möglicherweise möchten Sie eine Kategorie erstellen, die ungefähr so ​​funktioniert:

-(NSString *)getUTCFormateDate:(NSDate *)localDate
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setTimeZone:timeZone];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *dateString = [dateFormatter stringFromDate:localDate];
    [dateFormatter release];
    return dateString;
}
Jessecurry
quelle
2
NSTimeZone * timeZone = [NSTimeZone timeZoneWithName: @ "UTC"]; [dateFormatter setTimeZone: timeZone]; das hat es geschafft danke
Brodie
1
Wenn dies in die Produktion übergeht, möchten Sie möglicherweise einen statischen dateFormatter erstellen, der verzögert initialisiert wird. Das Erstellen eines DateFormatter ist eigentlich etwas teuer.
Jessecurry
3
Ich brauche es als Datumsobjekt, nicht als Zeichenfolge. Was kann ich in diesem Fall tun?
Maystro
1
Daten existieren unabhängig von Zeitzonen, die Zeitzone wird nur zur Erzeugung von Output für den menschlichen Verzehr verwendet.
Jessecurry
@ Jessecurry Nicht ganz richtig. Aus der NSDate-Klassenreferenz: "Diese Methode gibt einen Zeitwert relativ zu einem absoluten Referenzdatum zurück - dem ersten Zeitpunkt des 1. Januar 2001, GMT." Beachten Sie den klaren und spezifischen Verweis auf GMT.
Murray Sagal
13

NSDate ist eine Referenz auf ein Intervall ab einem absoluten Referenzdatum, dem 1. Januar 2001, 00:00 GMT. Die Klassenmethode [NSDate date] gibt also eine Darstellung dieses Intervalls zurück. Um diese Daten in einem Textformat in UTC darzustellen, verwenden Sie einfach den NSDateFormatter mit der entsprechenden NSTimeZone (UTC), um sie nach Bedarf zu rendern.

rcw3
quelle
3
Ich glaube, [NSDate now] sollte in dieser Antwort [NSDate date] sein.
Foldlettuce
2

NSDate- Objekte kapseln einen einzelnen Zeitpunkt, unabhängig von einem bestimmten Kalendersystem oder einer bestimmten Zeitzone. Datumsobjekte sind unveränderlich und repräsentieren ein unveränderliches Zeitintervall relativ zu einem absoluten Referenzdatum (00:00:00 UTC am 1. Januar 2001).

Schnelle Version:

extension NSDate {
    func getUTCFormateDate() -> String {
        let dateFormatter = NSDateFormatter()
        let timeZone = NSTimeZone(name: "UTC")
        dateFormatter.timeZone = timeZone
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        return dateFormatter.stringFromDate(self)
    }
}
Tichonow Alexander
quelle