2017-02-08 2 views
0

Ich habe eine ISO-8601 Datumszeichenkette wie folgt: "2017-02-07T00:00:00-08:00".Wie TimeZone aus Date-Objekt extrahieren?

Wie kann ich das TimeZone-Objekt von diesem Datum extrahieren?

+0

Es gibt keine Zeitzone in einem 'Date'-Objekt. Bitte klären Sie, was Sie eigentlich wollen. – rmaddy

+0

Ich habe die Frage aktualisiert, thx. – TruMan1

+0

Sie haben keine Zeitzone. Sie haben einen Offset von UTC. Siehe "time zone! = Offset" im [timezone tag wiki] (http://stackoverflow.com/tags/timezone/info). –

Antwort

-1

Sie könnten einen Datumsformatierer erstellen, der nur die Zeitzone wie folgt zurückgibt. Ändern Sie die Abkürzung in die Zeitzone, nach der Sie suchen.

let timeZoneOnlyDateFormatter: DateFormatter = { 
    let formatter = DateFormatter() 
    formatter.timeZone = TimeZone(abbreviation: "UTC") 
    formatter.dateStyle = .none 
    formatter.timeStyle = .none 
    return formatter 
}() 

Und verwenden Sie diese Funktionen, um es in eine Zeichenfolge zu konvertieren oder Ihre Zeichenfolge in ein Datum zu konvertieren.

func formatDateIntoString(date: Date, dateFormatter: DateFormatter) -> String { 
    return dateFormatter.string(from: date) 
} 


func formatStringIntoDate(string: String, dateFormatter: DateFormatter) -> Date! { 
    return dateFormatter.date(from: string) 
} 
3

Leider ist DateFormatter keine Hilfe, da Sie kein Date wollen noch liefert es keine Informationen über jede Zeitzone Daten zu einem Zeitpunkt analysiert String. Und TimeZone hat keinen Initialisierer, der eine Zeitzonenversatzzeichenfolge analysieren kann.

Sie müssen also die Arbeit selbst erledigen. Da Sie eine feste Format-Datumszeichenfolge haben, wissen Sie, dass der Zeitzonen-Offset immer die letzten 6 Zeichen der Zeichenfolge sein wird. Die letzten 2 davon sind die Anzahl der Minuten und die ersten 3 davon sind die Anzahl der Stunden (einschließlich des Zeichens).

Extrahieren Sie diese beiden Teilzeichenfolgen (Stunden und Minuten) aus der Datumszeichenfolge. Konvertieren Sie beide in Int. Dann machen Sie eine einfache Mathematik, um einen Offset in Sekunden zu berechnen (Stunden * 3600 + Minuten * 60).

Sobald Sie diesen Offset in Sekunden haben, können Sie eine TimeZone Instanz mit dem init(secondsFromGMT:) Initialisierer erstellen.