2016-09-18 2 views
1

Я бегу следующий код:DateFormatter изменения Дата 500 лет

if let messagedate = curr_comment["timestamp"] as? String { 
     let dateFormatter = NSDateFormatter() 
     dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
     let date = dateFormatter.dateFromString(messagedate) 
} 

и здесь выход отладчик:

enter image description here

Это началось сегодня происходит случайно, я не уверен, почему дата изменяется на 500 лет благодаря такой простой операции.

EDIT: Это происходит на устройстве, использующем буддийский календарь.

+0

Это, без сомнения, потому, что 'locale' для данного устройства не настроен для григорианского календаря. Если этот формат 'yyyy-MM-dd HH: mm: SS' предназначен для внутренних целей (сохранение в базе данных, связь с веб-службой и т. Д.), Вам следует рассмотреть возможность установки' locale' форматирования на 'en_US_POSIX'. См. [Technical Q & A 1480] (https://developer.apple.com/library/content/qa/qa1480/_index.html). – Rob

+0

Это что-то, что я мог бы сделать глобально для всего приложения в appDelegate, или это то, что я должен делать для каждого dateFormatter, который я использую в приложении. – Alk

+0

Он в основном используется для отображения того, как давно сообщение/комментарий были отправлены другим пользователям app – Alk

ответ

2

Это потому, что данное устройство не настроено для григорианского календаря. Он использует буддийский календарь. См. Apple Technical Q&A 1480, в котором обсуждается правильная обработка строк даты, чтобы изящно обрабатывать международные календари.

Если этот формат yyyy-MM-dd HH:mm:ss предназначен для внутренних целей (хранение в базе данных, связь с веб-службой и т. Д.), Вы должны рассмотреть возможность установки языкового стандарта форматирования на en_US_POSIX. В Swift 3:

dateFormatter.locale = Locale(identifier: "en_US_POSIX") 

в Swift 2:

dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 

Честно говоря, это также возникает вопрос относительно того, что часовой пояс строковое представление даты используется. Обычно вы хотели бы убедиться, что строки даты/времени постоянно сохраняются в формате UTC/GMT. В Swift 3:

dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) 

Или в Swift 2:

dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) 

Если вы сделаете это последовательно в течение всего приложения, вы будете избегать странные вопросы часового пояса (например, если кто-то в Нью-Йорке сообщений что-то прямо сейчас , Я не хочу, чтобы он рассказывал мне в CA, что это произошло три часа назад).

+0

как вы узнали, что это буддист? – Honey

+1

Я обманул. Когда я указал на OP, что различные календари были проблемой, он сказал мне, что проблема возникла на устройстве друга, используя буддийский календарь. Но это хорошо известная проблема, возникающая с множеством неглагорических календарей, поэтому речь идет о буддийском календаре, в частности, об общей проблеме отказа от использования «локали» 'en_US_POSIX'. – Rob

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