@org.junit.Test public void test() throws ParseException { SimpleDateFormat yyyy = new SimpleDateFormat("MM-dd-yyyy"); SimpleDateFormat YYYY = new SimpleDateFormat("MM-dd-YYYY"); System.out.println(yyyy.format(new Date())); System.out.println(YYYY.format(new Date())); System.out.println(yyyy.parse("12-25-2018")); System.out.println(YYYY.parse("12-25-2018")); } Console: 01-06-2019 01-06-2019 Tue Dec 25 00:00:00 CST 2018 Sun Dec 31 00:00:00 CST 2017
使用format 出来的日期的正确的,不要欢喜的太早,parse 给出的结果就彻底让人摸不着头脑。java
在 ISO 8601 中 Y 表明的是 Week of year
, 是不能和 MM``dd
一块儿使用的。要想用他须要和其余的格式化元素一块儿使用, u (一周当中的某天) 和 ww (一年中的某周),使用这两个元素咱们就能够正确的表示日期了。 这是一月份的日历编程
January 2019 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
@org.junit.Test public void test() throws ParseException { SimpleDateFormat YYYY = new SimpleDateFormat("ww-u-YYYY"); System.out.println(YYYY.format(new Date())); System.out.println(YYYY.parse("53-2-2018")); System.out.println(YYYY.parse("01-2-2019")); } Console: 02-7-2019 Tue Jan 01 00:00:00 CST 2019 Tue Jan 01 00:00:00 CST 2019
u 按照java 文档的解释为Day number of week (1 = Monday, ..., 7 = Sunday)
, 是从1 开始的,会让你觉得一周是从周一到周日,但从上面的执行来看,7 也就是周日应该是每周开始的第一天swift
Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_YEAR, 1);//2019 Jan 1st System.out.println(YYYY.format(calendar.getTime())); calendar.set(Calendar.DAY_OF_YEAR, 6); //2019 Jan 6th System.out.println(YYYY.format(calendar.getTime())); calendar.set(Calendar.DAY_OF_YEAR, 7); //2019 Jan 7th System.out.println(YYYY.format(calendar.getTime())); Console: 01-2-2019 02-7-2019 02-1-2019
这挺让人糊涂的,须要记住这个规则,其余编程语言中都将周日做为0来处理,更符合人们的心理。编程语言
回到最上面的那个,当咱们使用MM-dd-YYYY
来 parse 一个字符串日期的时候,出现了奇怪的结果。咱们再作一下实验:code
System.out.println(YYYY.parse("02-02-2017")); System.out.println(YYYY.parse("04-20-2017")); System.out.println(YYYY.parse("12-25-2018")); System.out.println(YYYY.parse("01-01-2018")); System.out.println(YYYY.parse("12-26-2019")); System.out.println(YYYY.parse("02-02-2019")); Console: Sun Jan 01 00:00:00 CST 2017 Sun Jan 01 00:00:00 CST 2017 Sun Dec 31 00:00:00 CST 2017 Sun Dec 31 00:00:00 CST 2017 Sun Dec 30 00:00:00 CST 2018 Sun Dec 30 00:00:00 CST 2018
对照日历能够发现,这些日期都是每一年的第一周的第一天(周日)。所以在其余元素与YYYY
不匹配时,程序永远获取的是默认的第一周第一天。orm
注: Erica Sadun 的 ISO-8601, YYYY, yyyy, and why your year may be wrong 使用swift 语言演示了这种状况,Java语言在格式化语句与默认行为上与 Apple 都不一致,记录在此。文档