文档章节

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

52iSilence7
 52iSilence7
发布于 01/06 18:13
字数 666
阅读 15
收藏 0
@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 都不一致,记录在此。

© 著作权归作者所有

上一篇: 平台与个人
52iSilence7

52iSilence7

粉丝 7
博文 109
码字总数 92129
作品 0
海淀
高级程序员
私信 提问
Elastic Search 新手笔记(2)—— 日期格式

前言 前一阵子,做了elasticsearc相关的工作,遇到了日期格式的问题,苦于当时找了好久,所以在这里记录一下。 正文 首先在这里贴出官方的讲解,官网永远是最好的老师。 Elasticsearch 官网日...

luckyHarry4
02/10
0
0
SQL转换日期字段的问题——SQL中CONVERT转化函数的用法[转]

今天遇到转换日期字段的问题,问题得到公司sql王的帮助后解决,遂又在网上搜到相关资料学习学习! SqlDataSource1.SelectCommand = "SELECT '' + RIGHT(XkzSqs.QYMC, LEN(XkzSqs.QYMC) - 4)...

老朱教授
2017/10/01
0
0
ORACLE/SQL用函数进行每年,每月,每周,每日的数据汇总

15/03/21 用函数进行每年,每月,每周,每日的数据汇总 假设一个销售明细表 saledetail 含有 国家(country),销售时间(saletime),销售额(salemoney)..等等 需要用到求和函数 SUM()和分组...

郑树恒
2015/08/26
75
0
Sql日期时间格式转换

sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 08:02/时间一般为getdate()函数或数据表...

鱼煎
2016/03/24
28
2
JavaScript图表的时间解析功能(2):日期格式化方法

目录[-] 用不同方式格式化日期 空白数据处理 在上一章内容我们讲解了amCharts的时间解析功能。今天对这个共鞥进行扩展,在amChart中使用不同方式格式化日期。 用不同方式格式化日期 你很有可...

詹真琦
2013/12/04
113
0

没有更多内容

加载失败,请刷新页面

加载更多

【1015】LNMP架构二

【1015】LNMP架构二 三、PHP安装 PHP安装和LAMP安装PHP方法有差别,需要开启php-fpm服务 1、下载PHP7至/usr/local/src/ 切换目录:cd /usr/local/src 2、解压缩 tar -jxvf php-7.3.0.tar.gz...

飞翔的竹蜻蜓
36分钟前
4
0
浅谈Visitor访问者模式

一、前言 什么叫访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+对其进行处理就叫作访问,那么...

青衣霓裳
54分钟前
6
0
JS内嵌多个页面,页面之间如何更快捷的查找相关联的页面

假设parent为P页面, P页面有两个子页面,分别为B页面和C页面; B页面和C页面分别内嵌一个iframe,分别为:D页面和E页面 现在通过B页面的内嵌页面D的方法refreshEpage(eUrl)来加载内嵌页面E的内容...

文文1
56分钟前
7
0
Hibernate 5 升级后 getProperties 错误

升级到 Hibernate 5 后,提示有错误: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Map; 完整的错误栈为: java.lang.NoSuchMethodError: org.hibernate......

honeymoose
57分钟前
6
0
mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部