NSDateFormatter Rückkehr Falsches Datum + Swift
Code :
let dateString = "2016-04-02"
var formatter: NSDateFormatter = NSDateFormatter()
formatter.timeZone = NSTimeZone(abbreviation: "GMT +3:00")
formatter.dateFormat = "yyyy-MM-dd"
println("dateString: \(dateString)")
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
let date = formatter.dateFromString(dateString)
println("date: \(date)")
formatter.dateFormat = "yyyy-MM-dd"
let formattedDateString = formatter.stringFromDate(date!)
println("formattedDateString: \(formattedDateString)")
Ausgabe :
dateString: 2016-04-02
date: Optional(2016-04-01 21:00:00 +0000)
formattedDateString: 2016-04-02
2016-04-01 21:00:00 +0000
Ich versuche zur Konvertierung einer Zeichenfolge in ein NSDate-Datentyp, aber nicht immer korrekten Wert. Ich habe versucht, viele Lösungen, aber nicht die Rückkehr korrekten Wert. Ich brauche es in yyyy-MM-dd-format (2016-04-02) genauso wie mein Eingang "2016-04-02". Wenn jemand helfen kann wäre echt apriciated. Vielen Dank im Voraus
- Leider können wir Ihre Frage zu verstehen. Die Ausgabe erhalten Sie eine Liste, in der die Frage scheint auf Ihre Anforderungen erfüllen. Können Sie das klären, bitte?
- Nein.. 1 Tag fehlt.. mein input ist 2016-04-02 Ausgabe wird aber 2016-04-01
- mögliche Duplikate von gibt ein Datum, eine Stunde in die Zukunft
- Ich bin mit webservice mit soap, damit ich verändert Datentyp string, die in webservice-so dass keine Notwendigkeit zu stoßen, meinen Kopf in der Wand. Vielen Dank für die Hilfe..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim konvertieren von string zu NSDate, wenn Sie nicht die Zeitzone setzen, um das Formatierungsprogramm, erhalten Sie die NSDate Datum in Ihrer lokalen Zeitzone. Ich nehme an, dass Sie Ihre Zeitzone ist GMT+3 .
Dann, wenn Sie den Wert von "date" (mit println, NSLog aber nicht NSDateFormatter), ohne die Einstellung der Zeitzone, die Sie erhalten GMT+0 Zeit. Dass warum du 3h später.
Hängt davon ab, wie zu verwenden NSDateFormatter, haben Sie die Datums-Zeichenfolge, wie Sie wollen. In Ihrem Fall, Es gibt, was Sie wollen, nicht wahr?
Denken Sie daran, dass NSDate präsentiert Sie sich einen moment Zeit.
Ich hatte das gleiche problem, und ich dies für mich gearbeitet
Müssen Sie die Zeitzone einstellen,
Dein date ist perfekt. 🙂 Kein Wortspiel beabsichtigt.
Ich werde aufwendigen mehr auf das, was @HoaParis beantwortet hat.
Zunächst NSDate stellt ein moment in der Zeit. Es ist nicht ein Datum-Zeit-Wert an der gegebenen Stelle. So NSDate vertreten Mitternacht in Greenwich 5:30 in der früh in Indien.
Nun zu deiner Frage. Wenn Sie geben ein Datum-format mit aus der Zeit der formatter wird davon ausgehen, dass es Mitte der Nacht. Auch wenn es nicht timezone erwähnt, nimmt es die aktuelle Zeitzone.
So '2016-04-02' steht für '2016-04-02, 00:00:00' in Ihrer Zeitzone. Deine Zeitzone ist GMT+3 das bedeutet, dass, wenn es Mitternacht ist an Ihrer Stelle ist es noch 21:00:00 Uhr des vorherigen Tages in Greenwich, also UK.
Als wir diskutiert NSDate ist ein moment in der Zeit die selben NSDate-Objekt repräsentiert diese zwei scheinbar unterschiedlichen Zeiten, aber in Wirklichkeit sind Sie die gleiche Zeit moment.
Beim drucken das Datum standardmäßig druckt es das Datum mit Bezug auf GMT und nicht Ihre Zeit-zone ich.e 2016-04-01, 21:00:00. Der formatter wird berücksichtigt, dass Ihre Zeitzone und stellen Sie es 2016-04-02'