NSDateFormatter无法解析德语月3月/ 6月/ 7月的三个字母缩写

时间:2016-03-13 10:36:37

标签: parsing nsdate nsdateformatter

我有一些格式为“10.Feb.2016”的德国日期,即当天的2位数字,当月的3个字母,年份的4位数字。

我尝试使用日期格式dd.MMM.yyyy,但这在3个德国月份失败了:

  • 10.Mär.2016
  • 10.Jun.2016
  • 10.Jul.2016

那是因为那是根据docsMMM实际上代表“日期缩写”,这确实可以保证或暗示三个字母。

如何使用任何语言解析月份中只有三个字母的日期? NSDateFormatter是否可以实现这一目标?

下面的代码说明了这个问题。它打印:

OK 10.Jan.2016
OK 10.Feb.2016
FAILED parsing: 10.Mär.2016
OK 10.Apr.2016
OK 10.Mai.2016
FAILED parsing: 10.Jun.2016
FAILED parsing: 10.Jul.2016
OK 10.Aug.2016
OK 10.Sep.2016
OK 10.Okt.2016
OK 10.Nov.2016
OK 10.Dez.2016

以下是代码:

let dateFormatter = NSDateFormatter()
dateFormatter.timeZone   = NSTimeZone(abbreviation: "UTC")
dateFormatter.dateFormat = "dd.MMM.yyyy"
dateFormatter.locale     = NSLocale(localeIdentifier: "de_DE")

let input = [
    "10.Jan.2016",
    "10.Feb.2016",
    "10.Mär.2016",
    "10.Apr.2016",
    "10.Mai.2016",
    "10.Jun.2016",
    "10.Jul.2016",
    "10.Aug.2016",
    "10.Sep.2016",
    "10.Okt.2016",
    "10.Nov.2016",
    "10.Dez.2016",
]

for test in input
{
    if let date = dateFormatter.dateFromString(test)
    {
        print("OK \(test)")
    }
    else
    {
        print("FAILED parsing: \(test)")
    }
}

1 个答案:

答案 0 :(得分:3)

奇怪的是,当我尝试你的代码时,只有" Mai"工作。所有其他人都失败了。

然而,在看了那些文档后,我尝试了这个改变:

dateFormatter.dateFormat = "dd.LLL.yyyy"

所有这些样本日期都有效(" OK"适用于所有人)。 LLL是"独立的"月,描述如下:

  

格式和独立表单之间最重要的区别是语法上的区别,对于需要它的语言。例如,许多语言要求没有关联日期的月份名称必须采用基本的主格式,而具有相关日期编号的月份名称应采用不同的语法形式:属性,部分等。另一种常见的区别类型格式和独立之间涉及大写...

我不太了解德语是否应该适用,但显然NSDateFormatter认为确实如此。