2017-09-20 1 views
0

Dies ist, was ich tun, wenn Picker Änderungen:DateFormatter.localizedString ist für einige der Termine gebrochen

extension Date { 
    var fromCurrentToUTC: Date { 
     return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT())) 
    } 
}  


var title = "--" 

if let date = datePickerView.date?.fromCurrentToUTC { 
    title = DateFormatter.localizedString(from: date, dateStyle: .medium, timeStyle: .none) 
} 

print("-----") 
print(datePickerView.date!) 
print(title) 
print(TimeZone.current) 
print(datePickerView.date!.timeIntervalSince1970) 

dateTimeSegmentControl.setTitle(title, forSegmentAt: 0) 

Und das ist, wie es für die Tage sieht:

enter image description here enter image description here enter image description here enter image description here

Angenommen. Alles ist in Ordnung für die Daten vor dem 6. November, und nach dem 6. November ist alles wieder vorbei. Warum?

Update:

Das kritische Datum für jede Zeitzone unterscheidet ich benutze. Zum Beispiel:

Warschau (0200) ist das Datum 30. Oktober Chicago (-0500) das Datum 6. November ist

Die bestellten Abzüge:

 
----- 
2017-11-04 00:00:00 +0000 
4 Nov 2017 
America/New_York (current) 
1509753600.0 
----- 
2017-11-05 00:00:00 +0000 
5 Nov 2017 
America/New_York (current) 
1509840000.0 
----- 
2017-11-06 00:00:00 +0000 
5 Nov 2017 
America/New_York (current) 
1509926400.0 
----- 
2017-11-07 00:00:00 +0000 
6 Nov 2017 
America/New_York (current) 
1510012800.0 

+1

meisten wahrscheinlich wegen des Endes der Sommerzeit (die vom Nov 5 2017 in Warschau und am 29. Oktober 2017 in Chicago). –

+0

was ?;) Wie kann ich Abhilfe schaffen? –

+0

Es scheint für Finnland (29. Oktober) zu funktionieren - sehe keine falschen Daten mit DateFormatter.localizedString –

Antwort

1

In Ihrer Funktion

extension Date { 
    var fromCurrentToUTC: Date { 
     return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT())) 
    } 
} 

der GMT-Offset des aktuellen Datums wird subtrahiert, nicht durch den GMT-Offset des Datums angepasst werden. Daher erhalten Sie ein falsches Ergebnis, wenn das zu justierende Datum in einer Sommerzeit ist und das aktuelle Datum nicht, oder umgekehrt.

, die von

mit fixiert werden kann stattdessen
extension Date { 
    var fromCurrentToUTC: Date { 
     return addingTimeInterval(-TimeInterval(TimeZone.current.secondsFromGMT(for: self))) 
    } 
} 

. Allerdings wäre eine bessere Lösung, um die Zeitzone des Datums Formatierer UTC einzustellen, statt das Datum der Einstellung:

if let date = datePickerView.date { 
    let fmt = DateFormatter() 
    fmt.dateStyle = .medium 
    fmt.timeStyle = .none 
    fmt.timeZone = TimeZone(secondsFromGMT: 0) 
    let title = fmt.string(from: date) 
    print(title) 
} 
+0

Sollte es dann funktionieren? Jetzt habe ich Probleme mit neuen xcode, aber überprüfen Sie es bald –

+0

@ BartłomiejSemańczyk: Es funktionierte in meinem Test, aber Sie sollten es selbst verifizieren. –

+0

@ BartłomiejSemańczyk: Beachten Sie, dass eine bessere Lösung darin bestünde, ein benutzerdefiniertes Datumsformatierungsprogramm mit der auf UTC festgelegten Zeitzone zu verwenden, anstatt das Datum anzupassen. –