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


person Sanjay Kumar    schedule 02.04.2015    source источник
comment
Извините, мы не можем понять ваш вопрос. Результат, который вы указали в вопросе, кажется, соответствует вашим требованиям. Можете ли вы уточнить, пожалуйста?   -  person emrys57    schedule 02.04.2015
comment
Нет .. 1 день отсутствует .. мой ввод 2016-04-02, но вывод 2016-04-01   -  person Sanjay Kumar    schedule 02.04.2015
comment
возможный дубликат возвращает дату через час в будущем   -  person Matthias Bauch    schedule 02.04.2015
comment
Я использую веб-сервис с мылом, поэтому я изменил тип данных на строку в веб-сервисе, поэтому мне не нужно биться головой о стену. Большое спасибо за помощь мне..   -  person Sanjay Kumar    schedule 03.04.2015


Ответы (3)


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

Затем, когда вы показываете значение «дата» (используя println, NSLog, но не NSDateFormatter), без установки часового пояса, вы получите время по Гринвичу + 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'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)")
person Duyen-Hoa    schedule 02.04.2015
comment
Я использовал formatter.timeZone = NSTimeZone (аббревиатура: GMT+3:00); formatter.locale = NSLocale (localeIdentifier: en_US_POSIX) все еще получает 2016-04-01 21:00:00 +0000 - person Sanjay Kumar; 02.04.2015
comment
На самом деле он не возвращает правильную дату.. ввод: 2016-04-02 - вывод: 2016-04-01 21:00:00 +0000 означает, что здесь отсутствует один день - person Sanjay Kumar; 02.04.2015
comment
Потому что ваш часовой пояс с GMT+3 — это ваш часовой пояс. Как я уже сказал, NSDateFormatter по умолчанию использует наш местный часовой пояс. Таким образом, это даст вам тот же результат, что и без указания чего-либо. Во-вторых, «отсутствует» 3 часа, но не день. - person Duyen-Hoa; 02.04.2015
comment
когда вы конвертируете с использованием GMT+3 с вашей строкой даты, это означает, что время в GMT+3 составляет 2016-04-02 00:00:000. Таким образом, в тот же момент время в часовом поясе GMT+0 на 3 часа позже вашего, то есть 2016-04-01 21:00:00 +0000. Надеюсь, что это более ясно. - person Duyen-Hoa; 02.04.2015

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

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

formatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")
person Christos Chadjikyriacou    schedule 02.04.2015
comment
Я пробовал, но не дает правильного возвращаемого значения. один день отсутствует] - person Sanjay Kumar; 02.04.2015
comment
Вы добавляете правильный часовой пояс? У меня GMT +0:00, потому что я с Кипра - person Christos Chadjikyriacou; 02.04.2015
comment
теперь я получаю правильный ответ - NSTimeZone (аббревиатура: UTC). Спасибо вам всем - person Sanjay Kumar; 02.04.2015
comment
Я живу в Астане, какой у меня часовой пояс? UTC или GMT? - person Yestay Muratov; 17.06.2015
comment
У меня возникает проблема после установки часового пояса. Тем не менее он занимает системный часовой пояс. - person Jitendra; 02.03.2017

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

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

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

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

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

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

Когда вы печатаете дату по умолчанию, она будет печатать дату относительно GMT, а не вашего часового пояса, например, 2016-04-01, 21:00:00. Средство форматирования учтет ваш часовой пояс и сделает его «2016-04-02».

person Abdullah    schedule 02.04.2015