Nsdateformatter возвращает неправильную дату + Swift
код :
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)")
выход :
dateString: 2016-04-02
date: Optional(2016-04-01 21:00:00 +0000)
formattedDateString: 2016-04-02
2016-04-01 21:00:00 +0000
Я пытаюсь преобразовать строку в тип данных NSDate, но не получаю правильное значение. Я пробовал много решений, но не возвращал правильное значение. Мне это нужно в формате гггг-ММ-ДД (2016-04-02) так же, как мой вход "2016-04-02". Если кто может помочь буду очень apriciated. Заранее спасибо
4 ответов
при преобразовании из string в NSDate, если вы не установите часовой пояс в форматер, вы получите NSDate даты в вашем локальном часовом поясе. Я полагаю, что ваш часовой пояс GMT+3 .
затем, когда вы показываете значение "дата" (используя println, NSLog, но не NSDateFormatter), без установки часового пояса, вы получите GMT+0 Время. Вот почему вы получили 3h позже.
в зависимости от того, как использовать NSDateFormatter, у вас будет строка даты, как вы хотите. В вашем случае, это возвращает то, что вы хотите, не так ли?
помните, что nsdate хранит значение как GMT+0 раз.
let dateString = "2016-04-02"
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
println("dateString: \(dateString)")
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
let date = formatter.dateFromString(dateString) //without specify timezone, your dateString "2016-04-02" is your local time (GMT-3),
//means it's 2016-04-02 00:00:000 at GMT+0. That is the value that NSDate holds.
println("date: \(date)") //that why it show 2016-04-01 21:00:000, but not 2016-04-02 00:00:000
formatter.dateFormat = "yyyy-MM-dd"
let formattedDateString = formatter.stringFromDate(date!)
println("formattedDateString: \(formattedDateString)")
У меня была та же проблема, и я это сработало для меня
вам нужно установить часовой пояс
formatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")
ваше свидание отлично. :- ) Каламбур не предназначен.
Я подробнее расскажу о том, что ответил @HoaParis.
прежде всего NSDate представляет собой момент времени. Это не значение даты и времени в данном месте. Таким образом, NSDate, представляющий полночь в Гринвиче, будет 5:30 утра в Индии.
теперь перейдем к вашему вопросу. Когда вы даете формат даты без времени, форматер будет считать, что это середина ночи. И если нет часового пояса упомянуто, что это займет текущий часовой пояс.
Так '2016-04-02' представляет '2016-04-02, 00:00: 00' в вашем часовом поясе. Ваш часовой пояс GMT+3, Что означает, когда это полночь на вашем месте, это все еще 21:00: 00 часов предыдущего дня в Гринвиче, т. е. Великобритании.
Как мы обсуждали, NSDate-это момент времени, когда один и тот же объект NSDate представляет эти два, казалось бы, разных времени, но на самом деле они являются одним и тем же моментом времени.
при печати даты по умолчанию он будет печатать дату относительно GMT, а не вашего часового пояса i.е 2016-04-01, 21: 00: 00. Форматер будет учитывать ваш часовой пояс и сделать его "2016-04-02"
let dateFormatter = DateFormatter()
//Your current Date Format
dateFormatter.dateFormat = "yyyy-MM-dd"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
let finaldate = dateFormatter.date(from:"Your String")
//Your changing Date Format
dateFormatter.dateFormat = "MMM-dd"
let second = dateFormatter.string(from: finaldate!)