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!)