Можно ли использовать NSDateformatter для чтения месяцев на шведском языке

Я пытаюсь разобрать список дат. Даты выглядят так: «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
}

}

person fisher    schedule 05.05.2016    source источник
comment
Все форматы даты задокументированы в unicode.org/reports/tr35/tr35-6. html # Date_Format_Patterns. MMM означает сокращенный месяц, но это не обязательно три буквы (как в сентябре).   -  person Martin R    schedule 05.05.2016
comment
Да, я знаю, что формат МММ не подразумевает 3-х буквенное обозначение. Итак, что я могу использовать, чтобы определить, что это должно быть 3 буквы?   -  person fisher    schedule 05.05.2016
comment
Я не вижу такого формата в документации Unicode, поэтому боюсь, что вам придется создавать свой собственный парсер.   -  person Martin R    schedule 05.05.2016
comment
Спасибо за разъяснения! Я сделаю собственное форматирование :)   -  person fisher    schedule 05.05.2016
comment
@fisher Вам не обязательно создавать новый модуль форматирования / синтаксический анализатор, вы также можете явно указать названия месяцев на NSDateFormatter, полностью игнорируя настройки локали.   -  person Sulthan    schedule 05.05.2016


Ответы (2)


Остальные ответы верны. Это нестандартный формат Юникода, поэтому смена языкового стандарта вам не поможет. Однако вы можете явно указать названия месяцев!

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "ddMMMyy"
dateFormatter.shortMonthSymbols = ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"];

let date = dateFormatter.dateFromString("01JUN16")
print(date)
person Sulthan    schedule 05.05.2016
comment
Отлично, я этого не знал. - person fisher; 05.05.2016
comment
Интересно, что я не понимал, что shortMonthSymbols можно писать. - person Tom Harrington; 06.05.2016

Тебе не повезло с NSDateFormatter. Попробуйте это, и вы увидите:

print("Short month symbols: \(dateFormatter.shortMonthSymbols)")

Это напечатает ["jan.", "feb.", "mars", "apr.", "maj", "juni", "juli", "aug.", "sep.", "okt.", "nov.", "dec."]

Я не знаю, что распространено в Швеции, но, что касается NSDateFormatter, «JUN» не является допустимым коротким названием даты для шведских форматов. Использование shortStandaloneMonthSymbols дает почти тот же результат (по крайней мере, «Juni», а не «Jun»), поэтому замена MMM на LLL тоже не поможет (хотя на некоторых языках это помогает).

person Tom Harrington    schedule 05.05.2016