栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JAVA日期格式化大写YYYY-MM-dd和小写yyyy-MM-DD的坑

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA日期格式化大写YYYY-MM-dd和小写yyyy-MM-DD的坑

好记性不如烂笔头,如果自己记不住那就记录下来吧!


Java开发中我们总喜欢用小写的yyyy-MM-dd格式化日期,有时候也难免不会用到大写的YYYY-MM-dd去计算两个日期之间的天数。

        我为什么要在此记录这个问题?是由于我们生产上就因为大写的YYYY差点造成了一场重大的生产事故,幸运的是在告警之前同事自己发现了这个BUG,挽救了这场事故。

接下来我们就看看这二者之间的区别。

一、Java中日期格式化年YYYY和yyyy的区别

请看下面这段代码:

package com.date;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class YearTest {
    public static void main(String[] args) {
         //2021年倒数第二周
         Calendar calendar =  Calendar.getInstance();
         calendar.set(2021,Calendar.DECEMBER,20);
         Date date = calendar.getTime();

         //2021年最后一周
        Calendar lastCalendar =  Calendar.getInstance();
        calendar.set(2021,Calendar.DECEMBER,Calendar.DATE);
        Date lastDate = lastCalendar.getTime();

        //倒数第二周小写的年y
        SimpleDateFormat sdfy = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println("倒数第二周小写的年y:"+sdfy.format(date));
        //倒数第二周大小的年Y
        SimpleDateFormat sdfY = new SimpleDateFormat("YYYY-MM-dd");
        System.out.println("倒数第二周大写的年Y:"+sdfY.format(date));

        System.out.println("----------------------------");

        //最后一周小写的年y
        SimpleDateFormat lastSdfy = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println("最后一周小写的年y:"+lastSdfy.format(lastDate));
        //最后一周大小的年Y
        SimpleDateFormat lastSdfY = new SimpleDateFormat("YYYY-MM-dd");
        System.out.println("最后一周大写的年Y:"+lastSdfY.format(lastDate));


    }
}

猜猜这段代码执行后的结果有啥不同?

执行结果:

倒数第二周小写的年y:2021-12-20
倒数第二周大写的年Y:2021-12-20
----------------------------
最后一周小写的年y:2021-12-28
最后一周大写的年Y:2022-12-28

在2021年12月倒数第二周的时候不管年份是大写还是小写看起来都没啥问题,但是到了最后一周问题就出现了,因为年份不一样了,大写的Y就跑到了新的一年2022年了,这究竟是为什么?

因为大写的“YYYY” 是week-based year 是ISO-8601规定的,它表示的是当天所在周属于哪一年,因为2021.12.27-2022.1.2 这一周夸年了,所有就格式化成下一年了,也就是2022年了。

二、Java中日期格式化天DD和dd的区别

请看下面这段代码:

package com.date;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DayTest {
    public static void main(String[] args) {
         //2021年倒数第二周
         Calendar calendar =  Calendar.getInstance();
         calendar.set(2021,Calendar.DECEMBER,20);
         Date date = calendar.getTime();

         //2021年最后一周
        Calendar lastCalendar =  Calendar.getInstance();
        calendar.set(2021,Calendar.DECEMBER,Calendar.DATE);
        Date lastDate = lastCalendar.getTime();

        //倒数第二周小写的天d
        SimpleDateFormat sdfy = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println("小写的天d:"+sdfy.format(date));
        //倒数第二周大小的天D
        SimpleDateFormat sdfY = new SimpleDateFormat("yyyy-MM-DD");
        System.out.println("大写的天D:"+sdfY.format(date));

        System.out.println("----------------------------");

        //最后一周小写的天d
        SimpleDateFormat lastSdfy = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println("最后一周小写的天d:"+lastSdfy.format(lastDate));
        //最后一周大小的天D
        SimpleDateFormat lastSdfY = new SimpleDateFormat("yyyy-MM-DD");
        System.out.println("最后一周大写的天D:"+lastSdfY.format(lastDate));


    }
}

老实讲我还真没用过大写的DD

执行后的结果:

小写的天d:2021-12-20
大写的天D:2021-12-354
----------------------------
最后一周小写的天d:2021-12-28
最后一周大写的天D:2021-12-362

哇,看着362真开心,因为这一年马上就完了,还有3天就进入2022年啦!开心吗?

想必各位都看出区别了,大写的D打印出来的时间是这一年中的那一天,小写的d是这个月中的那一天。

有时候我们写代码写着写着就容易忽视这个问题,测试时也不容易测来,因此在格式化时间时,切记这个坑,以防出现生产事故。


敲代码时切记要细心,坚持工匠精神,追求精益求精。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/684373.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号