NSDateformatter 可以用于读取瑞典月份吗

Can NSDateformatter be used for reading swedish months

我正在尝试解析日期列表。日期如下所示:“01MAY16、01JUN16、01AUG16”等等。到目前为止,日期都是英文的,我已经成功地使用了 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")

这在日期为 'MAJ' 时工作正常,但这只是因为该月是一个由 3 个字母组成的月份。如果我尝试以下返回日期为零:

let date = dateFormatter.dateFromString("01JUN16")

它 returns 为零,因为它正在寻找的格式显然是 'juni'。所以格式 MMM 并不意味着 3 个字母。

所以我的问题。解决这个问题最简单的方法是什么?有没有我可以使用的技巧,或者我是否必须创建自己的格式化程序?

编辑

我从你那里学到了很多新东西,谢谢你。 手动设置 shortMonthSymbols 是一个很好的解决方案,但就我而言,我必须对挪威、瑞典和丹麦语言环境都这样做。我提出了一个覆盖 NSDateFormatter 的 dateFromString() 方法的解决方案。如果我做了一些非常愚蠢的事情,请告诉我。 当我知道我解析的所有日期(任何语言环境)始终使用 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 { [=13=] == "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。试试这个,你会看到:

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 也无济于事(尽管在某些语言中确实如此)。

其他答案都对。这不是标准的 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)