2015-04-02 2 views
6

Код: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». Если кто-то может помочь, это будет действительно изложено. Заранее спасибо

+0

Извините, мы не можем понять ваш вопрос. Вывод, который вы перечисляете в вопросе, кажется, соответствует вашим требованиям. Можете ли вы пояснить, пожалуйста? – emrys57

+0

Нет. 1 день отсутствует. Мой ввод 2016-04-02, но вывод 2016-04-01 –

+0

Возможный дубликат [возвращает дату в час в будущем] (http: // stackoverflow.com/questions/4976530/returns-a-date-a-hour-in-the-future) –

ответ

2

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

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

В зависимости от того, как использовать 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)") 
+0

Я использовал formatter.timeZone = NSTimeZone (аббревиатура: «GMT + 3: 00»); formatter.locale = NSLocale (localeIdentifier: "en_US_POSIX") по-прежнему получает 2016-04-01 21:00:00 +0000 –

+0

Фактически его не возвращается правильная дата .. ввод: 2016-04-02 - вывод: 2016-04- 01 21:00:00 +0000 означает, что здесь не хватает одного дня –

+0

Потому что ваш часовой пояс с GMT + 3 - ваш часовой пояс. Как я уже сказал, NSDateFormatter по умолчанию использует наш местный часовой пояс. Таким образом, он даст вам тот же результат, что и без указания чего-либо. Во-вторых, есть 3 часа «пропавших без вести», но не день. –

9

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

Вам необходимо установить часовой пояс

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

Я пробовал, но не дал правильное возвращаемое значение. один день отсутствует] –

+0

Вы добавляете правильное времяZone? Mine is GMT +0: 00, потому что я из Кипра –

+0

да .. Я обновлю свой вопрос с кодом обновления –

4

Ваша дата является вполне хорошим. :-) Никакой каламбур не предназначено.

Подробно о том, что ответил @HoaParis.

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

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

So '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»

2
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!) 
Смежные вопросы