前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不要使用 YYYY ,使用 yyyy 来获取年份

不要使用 YYYY ,使用 yyyy 来获取年份

作者头像
Dylan Liu
发布2019-07-01 13:22:19
1.1K0
发布2019-07-01 13:22:19
举报
文章被收录于专栏:dylanliudylanliu
@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 给出的结果就完全让人摸不着头脑。

在 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 也就是周日应该是每周开始的第一天

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 一个字符串日期的时候,出现了奇怪的结果。我们再做一下实验:

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不匹配时,程序永远获取的是默认的第一周第一天。

注: Erica Sadun 的 ISO-8601, YYYY, yyyy, and why your year may be wrong 使用swift 语言演示了这种情况,Java语言在格式化语句与默认行为上与 Apple 都不一致,记录在此。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档