2016-03-13 2 views
0

Я хотел бы прочитать в дате в следующем формате: 2016-03-15T17: 30: 00-04: 00Как оптимально использовать NSDateFormatter в Swift

и отобразить это следующим образом: вторник, 15 Марта , в 5:30 PM

Сейчас у меня следующий код:

var strDate = "2016-03-15T17:30:00-04:00" 

let dateFormatter = NSDateFormatter() 
dateFormatter.locale = NSLocale.currentLocale() 

dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" 
let dateObj = dateFormatter.dateFromString(strDate) 

dateFormatter.dateFormat = "EEEE, MMMM dd, 'at' h:mm a" 
print(dateFormatter.stringFromDate(dateObj!)) 

код выше работ, но я поставил DateFormat объекта NSDateFormatter дважды - один раз, чтобы преобразовать строку в объект NSDate и другое время отображения объекта даты в виде строки.

Является ли это оптимальным способом использования NSDateFormatter или есть способ, которым я могу это сделать без необходимости устанавливать датуFormat дважды?

Альтернативный подход состоял бы в том, чтобы иметь два объекта NSDateFormatter, каждый из которых имеет другой формат даты. Затем я мог бы использовать каждый из них, основываясь на том, читаю ли я дату или покажу ее. Будет ли это лучшим подходом к проблеме?

+1

Обратите внимание, что при разборе даты RFC 3339/ISO 8601 вы не хотите использовать 'curentLocale', а скорее' NSLocale (localeIdentifier: "en_US_POSIX") '. Но при отображении для пользователя, затем перезагрузите 'locale' в' currentLocale'. См. Http://stackoverflow.com/a/35951529/1271826. К вопросу об одном форматировании или двух, это зависит от того, будете ли вы делать это многократно (в этом случае вы, вероятно, хотите создать два отдельных форматирования, которые вы создаете или настраиваете один раз, которые вы используете повторно для каждой даты). Если вы делаете это только на одну дату, разница не будет наблюдаемой. – Rob

+0

Спасибо за ваш ответ @Rob. Я буду разбирать и преобразовывать несколько строк даты, поэтому, я думаю, я создам два NSDateFormatters как статические переменные и даю каждому свой собственный язык. – Iavor

ответ

0

Если вы обеспокоены эффективностью, вы используете два NSDateFormatters, по одному для каждого преобразования, и устанавливаете их только один раз, возможно, как статические переменные. Очевидно, что лучше всего измерить, сколько времени это занимает.

+2

Если вы создадите их один раз и сохраните их в статических переменных, убедитесь, что один и тот же класс настроен для прослушивания уведомления NSCurrentLocaleDidChangeNotification. При получении должны быть созданы новые форматы даты. – rmaddy

+0

Спасибо за ответ gnasher729, я буду использовать два NSDateFormatters. @rmaddy Почему я должен слушать уведомление NSCurrentLocaleDidChangeNotification? – Iavor

+0

В случае изменения пользователем языка. Ваши кешированные форматы даты будут основаны на старой локали. – rmaddy