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)
我正在尝试解析日期列表。日期如下所示:“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)