小心时间格式里 yyyy 的大小写

团队里的测试工程师测试出一个 bug,表现是:在 Date Picker 选择了2015 年 12 月 27 日,但并显示到 Textfield 里时,变成了 2016-12-27。选择 12 月较早一些的日期,不会出现任何问题。

刚开始感觉一定是测试看花眼了,但尝试之后发现的确可以复现,而且,是必现!

检查了一下代码,发现此处的 NSDateFormatter 对象的 dateFormat 赋了 YYYY-MM-dd,总感觉哪里怪怪的。看了一下其他地方的代码,才意识到,年份一般都是写成小写的 yyyy 的。改成 yyyy-MM-dd 后,果然一切恢复正常了。

但是这个 yyyy 和 YYYY 到底有何区别呢?

查了一下资料,得知 YYYY 表示的是 Week Year,也就是当前日期所在周的年份。一周从周日开始,周六结束,只要本周跨年,就进入了下一年。所以 2015 年 12 月 27 日这一天,用 YYYY 得到的年份就是 2016。

苹果的开发文档中,对日期时间格式的描述是在 Introduction to Data Formatting Programming Guide For CocoaDate Formatters 章节里。从文档中可以看到,苹果遵循的规范是 UNICODE LOCALE DATA MARKUP LANGUAGE (LDML) PART 4: DATES。这个规范的最后有一张表 Date Field Symbol Table,里面记载了所有的时间描述符,挺有意思的,准备有时间的时候仔细看看。