2015-10-06 2 views
0

NSDateFormatter не похоже на октябрь 18-го. Пробовал каждую другую дату с успехом. (???)Ошибка в swift 2.0 NSDateFormatter?

Это почти наверняка ошибка в быстром 2.0 (и если это то, что я должен делать? Мне нужно отправить свое приложение в ближайшее время). Я что-то упускаю?

Проверено его в игровой площадке на Xcode 7.0.1:

let str = "2015-10-18" 
let str2 = "2015-10-14" 

let formatter = NSDateFormatter() 
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
formatter.dateFormat = "yyyy-MM-dd" 

var date = formatter.dateFromString(str) 
var date2 = formatter.dateFromString(str2) 

Выход:

"2015-10-18" 
"2015-10-14" 

<NSDateFormatter: 0x7f8aa050b760> 
<NSDateFormatter: 0x7f8aa050b760> 
<NSDateFormatter: 0x7f8aa050b760> 

nil 
"Oct 14, 2015, 12:00 AM" 
+0

Это, конечно, * не * ошибка в Swift 2, так как я просто использовал свой код [без ошибок] (https://www.evernote.com/l/AOxUu3wld7hOmJRbAZ-5Gril9A9Jp_FMbyc). :) – Moritz

+0

@EricD. странно. У меня такая же ошибка. Какую версию XCode вы используете? – Caio

+0

@Caio Xcode 7 GM. Также работает в Xcode 7.1 бета-версии. – Moritz

ответ

1

поведения зависит от того, timeZone форматировщика использования.

Например: America/Sao_Paulo

В Сан-Паулу, http://www.timeanddate.com/time/change/brazil/sao-paulo?year=2015

Воскресеньем, 18 октября 2015, 00:00:00 часов повернуты вперед 1 час воскресенье, 18 октября 2015, 01: 00:00 Местное летнее время вместо

Это означает, что в Сан-Паулу нет 2015-10-18 00:00:00.

И как для NSDateFormatter, когда он не получает времени информации из строки, она принимает время находится в часовом поясе 00:00:00. Вот почему он возвращает nil.

let formatter = NSDateFormatter() 
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
formatter.timeZone = NSTimeZone(name: "America/Sao_Paulo") 
formatter.dateFormat = "yyyy-MM-dd HH:mm" 

formatter.dateFromString("2015-10-18 00:00") // -> nil 
formatter.dateFromString("2015-10-18 00:30") // -> nil 
formatter.dateFromString("2015-10-18 01:00") // -> non nil 

Как указано @LeoDabus, при указании .calendar на форматере:

это предполагает, что время находится в часовом поясе 00:00:00.

он примет начало дня на эту дату.

let formatter = NSDateFormatter() 
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
formatter.timeZone = NSTimeZone(name: "America/Sao_Paulo") 
formatter.dateFormat = "yyyy-MM-dd" 
formatter.calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian) 

formatter.dateFromString("2015-10-17") // -> Oct 17, 2015, 12:00 AM 
formatter.dateFromString("2015-10-18") // -> Oct 18, 2015, 1:00 AM 
formatter.dateFromString("2015-10-19") // -> Oct 19, 2015, 12:00 AM 
+1

Такое поведение на самом деле зависит, если вы укажете календарь или нет. Если вы это сделаете, это займет начало дня для этой даты для определенного языкового стандарта. В этом случае 1am, поэтому нет необходимости указывать время. –

+0

HI Leo, у меня была такая же проблема с использованием Objective-C, не могли бы вы помочь мне с Objective-C похожим кодом? –

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