年底最后一周了,是不是被叫去加班改“YYYY-MM-dd“了

本文介绍了Java中SimpleDateFormat的YYYY-MM-dd与yyyy-MM-dd格式化日期时出现的问题。在年底,由于YYYY代表基于周的年份,可能导致日期错误,如2021年12月26日被格式化为2022年。建议通常使用yyyy-MM-dd格式。此外,还提到了Calendar中月份设置为0表示1月的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 如果年底的兄弟,正好写代码遇到了这个问题,那就停一下脚,看一眼吧。

下面开始介绍,直接上demo

首先

1.创建两个日期格式化

2.分别去格式化两个不同的日期:2021年12月25日(周六),2020年12月26日(周日)

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

public class demo01 {
    public static void main(String[] args) {
        SimpleDateFormat df1 = new SimpleDateFormat("YYYY-MM-dd");
        SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");

        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR,2021);
        c.set(Calendar.MONTH,11);
        c.set(Calendar.DATE,25);

        System.out.println("YYYY-MM-dd = " + df1.format(c.getTime()));
        System.out.println("yyyy-MM-dd = " + df2.format(c.getTime()));

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

        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()));
    }
}

然后

跑一下demo,出来结果如下:

YYYY-MM-dd = 2021-12-25
yyyy-MM-dd = 2021-12-25
========================
YYYY-MM-dd = 2022-12-26
yyyy-MM-dd = 2021-12-26
  • 2021年12月25日(周六),两种格式化都正确

  • 2021年12月26日(周日),YYYY-MM-dd出了问题,年份到了2022年

这就是为啥子,到年底这几天,兄弟们加班改bug的原因。

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

所以,在一般没啥特殊业务场景处理下,兄弟们还是使用yyyy-MM-dd格式吧。

最后,再补充一个狗都知道的知识点,要是你不知道,就当我没说。

Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR,2021);
        c.set(Calendar.MONTH,11);
        c.set(Calendar.DATE,25);

控制台:
YYYY-MM-dd = 2021-12-25
yyyy-MM-dd = 2021-12-25

为什么我这里set的月份是11,而控制台打印出来的确实12月嘞,这个当时我也是没百度出来,估计是我语言没组织好,百度听不懂我说的话,问了一嘴群里的兄弟,就有答案了呢。

然后就去看了一眼Calendar类的底层,发现一句注释是这样说的,

/**
     * Field number for <code>get</code> and <code>set</code> indicating the
     * month. This is a calendar-specific value. The first month of
     * the year in the Gregorian and Julian calendars is
     * <code>JANUARY</code> which is 0; the last depends on the number
     * of months in a year.
*/

意思就是,

*字段号get和set表示

*月。这是一个特定于日历的值。第一个月

*公历和儒略历的年份是

* 一月是0;最后一个取决于数量一年中的几个月。

下面哥们儿来总结一下,MONTH加1的原因:

public statci final int MONTH 指示月份的 get 和 set 的字段数字。这是一个特定于日历的值。在格

里高利历和罗马儒略历中一年中的第一个月是JANUARY,它为0;最后一个月取决去一年中的月

份数。简单来说,因为这个值的初始值是0,因此我们要用它来表示正确的月份就需要加1。
 

好了,分享给你那傻兄弟吧,别让他走你走过的路了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值