NSDateFormatter 无法解析德语月份 March/June/Jul 的三个字母缩写

Posted

技术标签:

【中文标题】NSDateFormatter 无法解析德语月份 March/June/Jul 的三个字母缩写【英文标题】:NSDateFormatter fails parsing three letter abbreviation of German month March/June/Jul 【发布时间】:2016-06-28 09:47:21 【问题描述】:

我有许多德国日期,格式为“2016 年 2 月 10 日”,即 2 位数字表示日期,3 个字母表示月份,4 位数字表示年份。

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

2016 年 3 月 10 日 2016 年 6 月 10 日 2016 年 7 月 10 日

那是因为根据docs,MMM实际上代表“日期缩写”,它确实保证或暗示恰好三个字母。

我怎样才能解析一个恰好包含三个字母的日期,并且可以使用任何语言?这甚至可以用 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】:

奇怪的是,当我尝试您的代码时,只有“Mai”有效。其他都失败了。

但是,在查看了该文档后,我尝试了此更改:

dateFormatter.dateFormat = "dd.LLL.yyyy"

所有这些示例日期都有效(全部“OK”)。 LLL是“独立”月份,描述如下:

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

我对德语的了解还不够,无法说出这是否应该适用,但显然NSDateFormatter 认为它适用。

【讨论】:

你太棒了!谢谢!

以上是关于NSDateFormatter 无法解析德语月份 March/June/Jul 的三个字母缩写的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发中的NSDateFormatter日期格式解析总结

NSDateFormatter 没有显示完整的月份名称,只有一位数字

使用 NSDateFormatter 格式化月份和年份返回无效日期

关于NSDateFormatter的格式

iOS dateFormatter dateFromString 月份问题

NSDateFormatter 仍在解析而不是格式不正确