还记得去年分享过一篇日期格式化使用 YYYY-MM-dd 的潜在问题的文章不?

历史又重演了...

事故现场

我们来写个单元测试,重现一下这个问题。

测试逻辑:

  1. 创建两个日期格式化,一个是出问题的YYYY-MM-dd,另一个是正确用法yyyy-MM-dd
  2. 分别去格式化两个不同的日期:2020年12月26日(周六),2020年12月27日(周日)

具体代码如下:

public class Tests {

    @Test
public void test() throws Exception {
SimpleDateFormat df1 = new SimpleDateFormat("YYYY-MM-dd");
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); // 2020年12月26日周六
c.set(Calendar.DATE, 26);
System.out.println("YYYY-MM-dd = " + df1.format(c.getTime()));
System.out.println("yyyy-MM-dd = " + df2.format(c.getTime())); // 分割线
System.out.println("========================"); // 2020年12月27日 周日
c.add(Calendar.DATE, 1);
System.out.println("YYYY-MM-dd = " + df1.format(c.getTime()));
System.out.println("yyyy-MM-dd = " + df2.format(c.getTime()));
} }

跑一下测试,可以看到输出结果如下:

YYYY-MM-dd = 2020-12-26
yyyy-MM-dd = 2020-12-26
========================
YYYY-MM-dd = 2021-12-27
yyyy-MM-dd = 2020-12-27
  • 2020年12月26日(周六),两种格式化都正确
  • 2020年12月27日(周日),YYYY-MM-dd出了问题,年份到了2021年

本文首发于独立博客:http://blog.didispace.com/YYYY-MM-dd-2020-again/ ,更多技术干货欢迎收藏关注。

问题原因

为什么YYYY-MM-dd格式化2020年12月27日的时候,会到2021年呢?

因为YYYY是week-based-year,表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。

所以2020年12月27日那天在这种表述方式下就已经到 2021 年了。

而当使用yyyy的时候,就还是 2020 年。


最后,自查一下你的程序是否有这样的问题吧!

欢迎关注我的公众号:程序猿DD,获得独家整理的免费学习资源助力你的Java学习之路!另每周赠书不停哦~

听说又有兄弟因为用YYYY-MM-dd被锤了...的更多相关文章

  1. Oracle中把一个DateTime的字符串转化成date类型。to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'),

    Oracle中把一个DateTime或者该形态字符串转化成date类型. to_date('2016/12/8 18:55:43','yyyy/MM/dd hh24:mi:ss'), 或者: sele ...

  2. Excel日期格式单元格写成yyyy.MM.dd格式将无法读取到DataTable

    最近在改公司的订单系统,遇到了一个奇怪的问题.C#程序需要从Excel文件中将数据全部读取到DataTable,其中Excel文件的第一列是日期格式yyyy/MM/dd,而这一列中大部分的单元格都是按 ...

  3. 让用户输入一个日期字符串,将其转换成日期格式, 格式是(yyyy/MM/dd,yyyyMMdd,yyyy-MM-dd)中的一种, 任何一种转换成功都可以; 如果所有的都无法转换,输出日期格式非法。

    第三种方法 while(true) {             Date d;        System.out.println("正在进行第一次匹配,请稍后~—~");     ...

  4. 从客户端(ASPxFormLayout1$txtRule="<YYYY><MM><DD><XXXX>")中检测到有潜在危险的 Request.Form 值

    在有文本框的值属于这种时<YYYY><MM><DD><XXXX>,会报这个错 在webconfig中加入 <httpRuntime request ...

  5. C# 时间格式 yyyy/mm/dd

    今天遇到个问题在C#中将日期格式设置为yyyy/MM/dd,我是这样写的: DateTime.Now.ToString("yyyy/MM/dd"); 可是获取到的日期还是显示yyy ...

  6. DateTime.Now.ToString("yyyy/MM/dd") 输出的结果是 2006-03-16(转)

    今天我在使用 DateTime.Now.ToString("yyyy/MM/dd") 输出的结果是 2006-03-16 而不是我想要的 2006/03/16,都快把我郁闷的不行了 ...

  7. JS 2019-12-03T15:53:23.000+08:00 转化为 YYYY MM DD

    js时间格式转化 2019-12-03T15:53:23.000+08:00 转化为 YYYY MM DD var dateee = new Date(createTime).toJSON();var ...

  8. DateTime.Now.ToString("yyyy/MM/dd") 时间格式化中的MM为什么是大写的?

    如果MM是小写,就表示时间里的分钟yyyy-MM-dd HH:mm:ss (年-月-日 时:分:秒) yyyy-MM-dd HH:mm:ss 年-月-日 时:分:秒大写是为了区分“月”与“分” 顺便说 ...

  9. 这里有个坑---js日期格式yyyy-MM-dd与yyyy/MM/dd

    这里有个坑,---------每一个遇到的坑总结后都是一比财富. 我们写脚本的时候,一般定义一个日期格式会使用“2015-12-21”和“2015/12/21”两种数据格式,由于各取所需日期格式并没有 ...

  10. js 时间YYYY-MM-DD转换为YYYY/MM/DD 自定义函数格式

    <script type="text/javascript">         window.onload = function () {             va ...

随机推荐

  1. CentOS下配置VNC

    配置桌面 # 安装gnome桌面环境 yum groupinstall Desktop -y # 安装中文语言支持包(可选) yum groupinstall 'Chinese Support' -y ...

  2. PADS生成贴片文件

    PADS生成贴片文件 VIEW-BOTTOM VIEW能够使Bottom层正常显示. 1. pastmask_top->Output Devices->Device Setup- 2. 进 ...

  3. moviepy执行TextClip.search方法时报错TypeError: a bytes-like object is required, not str

    ☞ ░ 前往老猿Python博文目录 ░ 执行TextClip.search方法时,报错: >>> from moviepy.editor import * >>> ...

  4. 老猿学5G扫盲贴:3GPP规范中与计费相关的主要规范文档列表及下载链接

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在<老猿学5G扫盲贴:3GPP规范中部分与计 ...

  5. 第三十五章、PyQt输入部件:QFontComboBox、QLineEdit、QTextEdit、QPlainText功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 输入部件量比较多,且功能很丰富,但除了用于编写编辑器.浏览器 ...

  6. 第15.16节 PyQt(Python+Qt)入门学习:PyQt中的信号(signal)和槽(slot)机制以及Designer中的使用

    老猿Python博文目录 老猿Python博客地址 一.引言 前面一些章节其实已经在使用信号和槽了,但是作为Qt中最重要的机制也是Qt区别与其他开发平台的重要核心特性,还是非常有必要单独介绍. 二.信 ...

  7. 代码审计【根据功能点定向审计】BugFree ZSWin重装案例

    (哦对了!这些CMS代码不要安装在服务器上,先不说它们用来代码审计本身就是有漏洞的,而且在网上下载下来,也不能保证没有源码是否被篡改而留有后门,就安装在本地进行代码审计的练习即可) 我们先下载BugF ...

  8. MyBatis if 标签的坑,居然被我踩到了。。。

    事件的原因是这样的,需求是按条件查数据然后给前端展示就行了,写的时候想着挺简单的,不就是使用 MyBatis 动态 SQL 去查询数据吗? 现实还是很残酷的,等我写完上完 UAT 后,前端同学说根据s ...

  9. 第 6 篇 Scrum 冲刺博客

    每天举行会议 会议照片: 昨天已完成的工作与今天计划完成的工作及工作中遇到的困难: 成员姓名 昨天完成工作 今天计划完成的工作 工作中遇到的困难 蔡双浩 实现关注,被关注功能 补充注释,初步查找bug ...

  10. ps查看完整程序执行路径

    在linux下查看进程大家都会想到用 ps -ef|grep ***可是看到的不是全路径,怎么看全路径呢?每个进程启动之后在 /proc下面有一个于pid对应的路径例如:ps -ef|grep jav ...