2016-05-05 4 views
0

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

} 
+0

Все форматы дат задокументированы в http://unicode.org/reports/tr35/tr35-6.html#Date_Format_Patterns. «МММ» означает «сокращенный месяц», но это не обязательно три буквы (как в «Сент»). –

+0

Да, я знаю, что формат MMM не означает 3-букв. Итак, что я могу использовать, чтобы определить, что это должно быть 3 буквы? – fisher

+3

Я не могу видеть такой формат в документации Юникода, поэтому я боюсь, что вам нужно создать свой собственный парсер. –

ответ

4

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

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) 
+0

Отлично, я этого не знал. – fisher

+0

Интересно, я не понимал, что 'shortMonthSymbols' можно писать. –

2

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

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

Печатается ["jan.", "feb.", "mars", "apr.", "maj", "juni", "juli", "aug.", "sep.", "okt.", "nov.", "dec."]

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

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

  • Нет связанных вопросов^_^