2016-12-07 3 views
0

Я тестирую некоторые значения для формата даты ("dd-MM-yyyy") и есть особый случай, который я не могу объяснить:IOS - NSDateFormatter dateFromString возвращает ноль только в одном случае

var datef = NSDateFormatter() 
datef.dateFormat = "dd-MM-yyyy"; 
var date_a = "02-01-1990" 
var date_b = "01-01-1990" 
var date_f_a = datef.dateFromString(date_a); 
var date_f_b = datef.dateFromString(date_b); 

data_f_a возвращается 2 января, 1990, 12:00, но date_f_b возвращает ноль. Любая другая дата вернет ожидаемое значение, за исключением 1 января 1990 года.

Если я добавлю datef.lenient = true, то дата_f_b больше не равна нулю, но мне не нужно это делать. Почему это неверная дата?

EDIT 1: Это происходит то же самое, если я использую :

Using Swift version 3

EDIT 2: версия Xcode: 8,1

+0

он отлично работает, когда DateFormatter используется вместо NSDateFormatter..i не получил ник для date_f_b –

+0

Добавить xCode-версию, которую вы используете в своем вопросе –

+0

Какова ваша локализация и часовой пояс? – rmaddy

ответ

2

Через несколько замечаний, было установлено, что код в вопросе бежится с локалью es_PE. Это страна Перу. Дата, о которой идет речь, - 1 января 1990 года. По умолчанию NSDateFormatter использует локальный часовой пояс и при синтаксическом анализе строк даты, которые не имеют времени, предполагается полночь.

В Перу в 1990 году дневные сбережения начались в полночь, 1 января 1990 года. Это означает, что часы были отправлены с 31 декабря 1989 года в 23:59:59 прямо до 1 января 1990 года в 1:00 : 12 утра. 1 января 1990 года не было полночь.

Именно поэтому попытка конвертировать строку 01-01-1990 не удалась для этого пользователя. В этот день в Перу не было полночь (и, возможно, несколько других мест, если таковые имели место, которые одновременно включали дневное свечение). Большинство людей, проверяющих этот код, утверждают, что это работает отлично, поскольку большинство людей, проверяющих этот код, не живут в Перу.

Я нашел полезный сайт с полезной информацией. См. http://www.timeanddate.com/time/change/peru/lima?year=1990 для получения более подробной информации о Перу и дневном свете. Обратите внимание, что в 1989 и 1991 годах в Перу не использовалось дневное свечение.

+0

Да, отличное объяснение того, что происходит. –

+0

Спасибо. Рад помочь. Ответ, который вы приняли, фактически не делает попыток объяснить проблему. И, пожалуйста, обратите внимание, что для вас совершенно правильно изменить, какой ответ вы принимаете, когда появятся лучшие ответы. – rmaddy

0

Для Xcode 7.3 Вы должны использовать NSDateComponents

var datef = NSDateFormatter() 
datef.dateFormat = "dd-MM-yyyy"; 

var dtCompo = NSDateComponents() 
dtCompo.day = 2 
dtCompo.month = 1 
dtCompo.year = 1990 
let cal = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
var date_f_a = cal.dateFromComponents(dtCompo) 

dtCompo = NSDateComponents() 
dtCompo.day = 1 
dtCompo.month = 1 
dtCompo.year = 1990 
var date_f_b = cal.dateFromComponents(dtCompo) 

var date_f_a_string = datef.stringFromDate(date_f_a!) 
var date_f_b_string = datef.stringFromDate(date_f_b!) 

print(date_f_a_string) 
print(date_f_b_string) 

выход будет enter image description here Xcode 8,1

var datef = DateFormatter() 
datef.dateFormat = "dd-MM-yyyy"; 

var dtCompo = DateComponents() 
dtCompo.day = 2 
dtCompo.month = 1 
dtCompo.year = 1990 
let cal = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)! 
var date_f_a = cal.date(from: dtCompo) 

dtCompo = DateComponents() 
dtCompo.day = 1 
dtCompo.month = 1 
dtCompo.year = 1990 
var date_f_b = cal.date(from: dtCompo) 

var date_f_a_string = datef.string(from: date_f_a!) 
var date_f_b_string = datef.string(from: date_f_b!) 

print(date_f_a_string) 
print(date_f_b_string) 

Выходной сигнал будет enter image description here

+0

Я использую 'NSDateFormatter' из-за моей быстрой версии (2.2). –

+0

С последней версией у меня такая же проблема –

+0

У меня есть два xCode, и оба будут давать правильный ответ на мой обновленный ответ –

Смежные вопросы