NSDateformatter可用于阅读瑞典月份

时间:2016-05-05 10:05:19

标签: swift nsdateformatter date-formatting nslocale

我正在尝试解析日期列表。日期如下所示:" 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个字母的月份。如果我尝试以下操作,则返回的日期为nil:

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

它返回nil,因为它正在寻找的格式显然是' 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 { $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
}

}

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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 isn&# 39;要去帮助(虽然在某些语言中它确实如此)。