Я пытаюсь разобрать список дат. Даты выглядят так: «01MAY16, 01JUN16, 01AUG16» и так далее. До сих пор все даты были на английском языке, и я успешно использовал NSDateFormatter следующим образом:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "ddMMMyy"
dateFormatter.locale = NSLocale(localeIdentifier: "en_US")
let date = dateFormatter.dateFromString("01MAY16")
Я сейчас наткнулся на проблему. Даты, которые я разбираю, имеют тенденцию отображаться со шведским языком, например: "01MAJ16, 01JUN16, 01OKT16". Я надеялся, что это можно будет проанализировать, установив для языкового стандарта в средстве форматирования даты шведский язык следующим образом:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "ddMMMyy"
dateFormatter.locale = NSLocale(localeIdentifier: "sv_SE")
let date = dateFormatter.dateFromString("01MAJ16")
Это нормально работает, когда дата - «MAJ», но только потому, что этот месяц состоит из трех букв. Если я попробую следующее, возвращенная дата будет равна нулю:
let date = dateFormatter.dateFromString("01JUN16")
Он возвращает nil, потому что формат, который он ищет, очевидно, «juni». Таким образом, формат MMM не подразумевает 3-буквенное обозначение.
Итак, к моему вопросу. Как проще всего это решить? Есть ли трюк, который я могу использовать, или мне нужно создать собственное средство форматирования?
ИЗМЕНИТЬ
Я узнал от вас много нового, спасибо. Установка shortMonthSymbols вручную - хорошее решение, но в моем случае мне пришлось бы сделать это как для норвежского, так и для шведского и датского языков. Я придумал решение, которое переопределяет метод dateFromString () NSDateFormatter. Скажите, пожалуйста, если я сделал что-то очень глупое. Это средство форматирования используется, когда я знаю, что все даты, которые я анализирую (любой язык), всегда используют трехбуквенный месяц:
class CustomDateFormatter : NSDateFormatter {
override func dateFromString(string: String) -> NSDate? {
guard let date = super.dateFromString(string) else {
//I only override the dateFormatter if no date is found and the dateFormat is set to exactly 3 M's (i.e ddMMMyy)
let charactersInDateFormat = self.dateFormat.characters
let mChars = charactersInDateFormat.filter { $0 == "M" }
guard mChars.count == 3 else {
return nil
}
var modifiedDateString = string.lowercaseString
for monthLocale in self.shortMonthSymbols {
let index = monthLocale.startIndex.advancedBy(3)
let threeLetterMonthString = monthLocale.substringToIndex(index).lowercaseString
if modifiedDateString.containsString(threeLetterMonthString) {
modifiedDateString = modifiedDateString.stringByReplacingOccurrencesOfString(threeLetterMonthString, withString: monthLocale)
break
}
}
return super.dateFromString(modifiedDateString)
}
return date
}
}
NSDateFormatter
, полностью игнорируя настройки локали. - person Sulthan   schedule 05.05.2016