2017-02-22 9 views
2

konnte ich nicht ändern Ich habe gerade den Code meiner App auf Swift 3 migriert und ich bekomme dieses wirklich nervige Problem mit dem DateFormatter (früher NSDateFormatter), das ich nicht mit Swift 2 oder früher bekommen habe.Die Zeitzone für DateFormatter in Swift 3

Das Problem ist, dass ich einen String in ein Date-Objekt und mein Code zu konvertieren, so zu tun, ist so etwas wie,

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd" 
let dateStr1 = "2017-02-22" 
let date1 = dateFormatter.date(from: dateStr1) 

Jetzt das funktioniert gut und wie in Xcode Spielplatz erwartet, aber wenn ich versuche, Führen Sie es von meiner App, Datum1 gibt 2017-02-21 13:00:00 +0000 IE einen Tag in der Vergangenheit und ich brauche date1 zu sein 2017-02-22 fyi, ich bin in Australien, wo ich bin diese Entwicklung machen.

Ich bekomme die Datumszeichenfolge von der Benutzeroberfläche meiner App, und von der Benutzeroberfläche ist 2017-02-22, also muss ich diese Zeichenfolge zu einem Date (oder NSDate) -Objekt in Swift konvertieren.

Ich habe versucht, die Zeitzone und Locale für die DateFormatter, Einstellung

dateFormatter.timeZone = TimeZone(identifier: TimeZone.current.identifier) 

dateFormatter.locale = Locale.init(identifier: Locale.current.identifier) 

aber noch kein Glück?

Ich mag auch das Datum aus dem Kalender-Komponenten zu schaffen versucht haben,

var dateComponents = DateComponents() 
var day = "22" 
var month = "02" 
var year = "2017" 
dateComponents.day = Int(day)! 
dateComponents.year = Int(year)! 
print(TimeZone.current) 
dateComponents.timeZone = TimeZone.current 
dateComponents.month = Int(month)! 
let userCalendar = Calendar.current 
let date1 = userCalendar.date(from: dateComponents) 

aber immer noch nicht den richtigen Zeitpunkt bekommen also immer 2017.02.21 statt 2017.02.22 ich auf einige ausgesehen haben der anderen SO Fragen wie

How do you create a swift Date object

Converting date between timezones swift

unter ot ihres. Irgendwelche Ideen, wie ich das gewünschte Ergebnis erreichen kann? Dieser Code funktionierte vor Swift völlig einwandfrei.

+0

Warum denken Sie, dass irgendetwas mit dem Code der ersten 4 Zeilen in Ihrer Frage falsch ist? Es ist in Ordnung und korrekt. – rmaddy

+1

Mitternacht am 22. Februar in Australien ist 13:00 Uhr am 21. UTC Zeit. Da ist nichts falsch. – rmaddy

+0

Fair genug! Ich habe die Frage bearbeitet, um das Problem zu verdeutlichen. – cptdanko

Antwort

1

Wie maddy in den Kommentaren darauf hingewiesen, zeigt Xcode Ihnen das Datum in seiner "rohen Form" von Universal Timezone - UTZ - (auch Greenwich Meantime genannt).

Um das Datum in einer anderen Zeitzone anzuzeigen, müssen Sie den DateFormatter erneut verwenden. So

:

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd" 
let dateStr1 = "2017-02-22" 
let date1: Date = dateFormatter.date(from: dateStr1)! 

print("\(date1)") 
print("\(dateFormatter.string(from: date1))") 

Gibt Ihnen:

Print screen of code in playground with output.

Ich bin mit diesem Code in Perth, Western Australia (dh UTZ + 8) - also wenn ich konvertiere 22-Feb -2017 in ein Datum wird es als 21-Feb-2017 UTZ gespeichert, aber wenn ich es wieder mit einem DateFormatter von meinem Gebietsschema präsentiere ich Mitternacht, 22-Feb-2017.