Я пытаюсь разобрать список дат. Даты выглядят так: «01MAY16, 01JUN16, 01AUG16» и так далее. До сих пор даты все были на английском языке, и я успешно использовал NSDateFormatter так:Может ли NSDateformatter использоваться для чтения швейцарских месяцев
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "ddMMMyy"
dateFormatter.locale = NSLocale(localeIdentifier: "en_US")
let date = dateFormatter.dateFromString("01MAY16")
я сейчас наткнулся на вопрос. Даты, которые я просматриваю, имеют тенденцию отображаться с использованием шведского языка: «01MAJ16, 01JUN16, 01OKT16». Я надеялся, что это может быть проанализирован путем установки локали в dateformatter шведскому так:
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "ddMMMyy"
dateFormatter.locale = NSLocale(localeIdentifier: "sv_SE")
let date = dateFormatter.dateFromString("01MAJ16")
Это прекрасно работает, когда дата «МАЙ», но только потому, что в этом месяце является 3-буквенный месяц. Если я пытаюсь следующие даты возвращенного равна нулю:
let date = dateFormatter.dateFromString("01JUN16")
возвращает ноль, потому что формат он ищет по-видимому, "Juni. Таким образом, формат MMM не подразумевает 3-букв.
Так что на мой вопрос. Какой самый простой способ решить эту проблему? Есть ли трюк, который я могу использовать, или мне нужно создать свой собственный форматировщик?
EDIT
Я много новых вещей узнал от вас, спасибо. Установка символов shortMonthSymbols вручную - это хорошее решение, но в моем случае я должен был бы сделать это как для норвежского, так и шведского языка. Я придумал решение, которое переопределяет метод dateFromString() NSDateFormatter. Скажите, пожалуйста, если я сделал что-то очень глупое. Этот форматировщик используется, когда я знаю, что все даты я анализирую (любой локали) всегда использует 3-буквенные месяц:
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
}
}
Все форматы дат задокументированы в http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns. «МММ» означает «сокращенный месяц», но это не обязательно три буквы (как в «Сент»). –
Да, я знаю, что формат MMM не означает 3-букв. Итак, что я могу использовать, чтобы определить, что это должно быть 3 буквы? – fisher
Я не могу видеть такой формат в документации Юникода, поэтому я боюсь, что вам нужно создать свой собственный парсер. –