2017-06-18 24 views
0

Ich ziehe ein Datum aus einer JSON-Datenbank. Das Datum ist wie 2017-06-16T13: 38: 34.601767 (ISO8601 denke ich) formatiert. Ich versuche, den ISO8601DateFormatter zu verwenden, um das Datum von 2017-06-16T13: 38: 34.601767 bis 2017-06-16 zu formatieren. Bisher kann ich die gezogene Zeichenkette nicht einmal als Datum formatieren.konvertieren ISO8601 Zeichenfolge in neu formatierte Datumszeichenfolge (Swift)

let pulledDate = self.pulledRequest.date 
var dateFormatter = ISO8601DateFormatter() 
let date = dateFormatter.date(from: pulledDate) 
print(date!) //nil 

Ich bin mir nicht sicher, ob ich das Datumsformat falsch habe und es ist nicht ISO8601 oder wenn ich nicht den ISO8601DateFormatter verwendet, wie beabsichtigt.

1.) Ist es ein ISO8601 Date?
2.) Benutze ich den ISO8601DateFormatter richtig?

Danke!

+0

sind Sie sicher, dass Sie 6 Stellen in Ihrem Millisekunden Block haben (0,601767)? –

+0

Leider, ja. Das hat mich auch geworfen. Ich sah jemand anders irgendwo (ich weiß, das ist hilfreich lol) sagen, sie hatten das gleiche und es war ISO8601 – froggomad

Antwort

2

ISO8601 verfügt über verschiedene Optionen, einschließlich einer Zeitzone. Es scheint, dass die ISO8601DateFormatter standardmäßig einen Zeitzonenindikator in der Zeichenfolge erwartet. Sie können wie so mithilfe von benutzerdefinierten Optionen, dieses Verhalten deaktivieren:

let pulledDate = "2017-06-16T13:38:34.601767" 
var dateFormatter = ISO8601DateFormatter() 
dateFormatter.formatOptions = [.withYear, .withMonth, .withDay, .withTime, .withDashSeparatorInDate, .withColonSeparatorInTime] 
let date = dateFormatter.date(from: pulledDate) 

Wenn Sie wissen wollen, was die Standard-Optionen sind, nur diesen Code auf einem Spielplatz laufen:

let dateFormatter = ISO8601DateFormatter() 
let options = dateFormatter.formatOptions 
options.contains(.withYear) 
options.contains(.withMonth) 
options.contains(.withWeekOfYear) 
options.contains(.withDay) 
options.contains(.withTime) 
options.contains(.withTimeZone) 
options.contains(.withSpaceBetweenDateAndTime) 
options.contains(.withDashSeparatorInDate) 
options.contains(.withColonSeparatorInTime) 
options.contains(.withColonSeparatorInTimeZone) 
options.contains(.withFullDate) 
options.contains(.withFullTime) 
options.contains(.withInternetDateTime) 

Natürlich, wenn Ihr string enthält keine Zeitzone, der Datumsformatierer interpretiert ihn immer noch in einer Zeitzone mit seiner Eigenschaft timeZone, die laut der Dokumentation standardmäßig auf GMT eingestellt ist.

Denken Sie daran, es zu ändern, bevor Sie die Formatierungs verwenden, wenn Sie Ihren Termin in einer anderen Zeitzone interpretieren wollen:

dateFormatter.timeZone = TimeZone(identifier: "Europe/Paris") 
+0

Ausgabe ist 2017-06-16 13:38:34 +0000 - gibt es eine Möglichkeit, die +0000 mit der abgeschnitten Formatierer? – froggomad

+1

Verwenden Sie einen anderen Formatierer mit denselben Optionen und der Option 'withSpaceBetweenDateAndTime'. – deadbeef

Verwandte Themen