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, но не получаю правильное значение. Я пробовал много решений, но не возвращал правильное значение. Мне нужно это в формате yyyy-MM-dd (2016-04-02) так же, как и мой ввод "2016-04-02". Если кто-то может помочь, это будет действительно изложено. Спасибо заранее

Ответ 1

Когда вы конвертируете из строки в NSDate, если вы не установите часовой пояс для форматера, вы получите NSDate даты в вашем местном часовом поясе. Я полагаю, что ваш часовой пояс GMT + 3.

Затем, когда вы показываете значение 'date' (используя println, NSLog, но не NSDateFormatter), без установки часового пояса, вы получите время GMT + 0. Вот почему вы получили 3 часа спустя.

Зависит от того, как использовать NSDateFormatter, у вас будет строка даты, как вы хотите. В вашем случае, он возвращает то, что вы хотите, не так ли?

Помните, что NSDate представляет момент времени.

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

Ответ 2

У меня была та же проблема, и я работал у меня

Вам нужно установить часовой пояс

formatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")

Ответ 3

Ваша дата отлично.:-) Каламбур не предназначен.

Я расскажу больше о том, что ответил @HoaParis.

Прежде всего NSDate представляет собой момент времени. Это не значение даты на данном месте. Таким образом, NSDate, представляющий полночь в Гринвиче, будет в 5:30 утра в Индии.

Теперь на ваш вопрос. Когда вы дадите формат даты со временем, форматировщик предположит, что это будет середина ночи. Также, если не указан часовой пояс, это займет текущий часовой пояс.

Итак, '2016-04-02' представляет '2016-04-02, 00:00:00' в вашем часовом поясе. Ваш часовой пояс - GMT + 3, что означает, что когда на вашем месте полночь, все равно 21:00:00 часов предыдущего дня в Гринвиче, то есть в Великобритании.

Как мы говорили, NSDate - это момент времени к тому же объекту NSDate, который представляет эти два, казалось бы, разные времена, но на самом деле они являются одним и тем же моментом времени.

Когда вы печатаете дату по умолчанию, она печатает дату относительно GMT, а не ваш часовой пояс i.e 2016-04-01, 21:00:00. Форматировщик учтет ваш часовой пояс и сделает его "2016-04-02"

Ответ 4

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