我正在尝试解析日期列表。日期如下所示:" 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
}
}
答案 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;要去帮助(虽然在某些语言中它确实如此)。