Java中慎用yyyy与YYYY

开始之前,先看一个单元测试跑出的结果:

    @Test
    public void should_get_string_when_given_date() {
        Long timeFor20191230 = 1577635200000L;
        Date date = new Date(timeFor20191230);

        String timeLower = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
        String timeUpper = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(date);

        System.out.println("yyyy-MM-dd HH:mm:ss" + " 对应 " + timeLower);
        System.out.println("YYYY-MM-dd HH:mm:ss" + " 对应 " + timeUpper);


        String timeForHourLower = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date);
        System.out.println("YYYY-MM-dd hh:mm:ss" + " 对应 " + timeForHourLower);
    }

第一个测试输出结果如下:

yyyy-MM-dd HH:mm:ss 对应 2019-12-30 00:00:00
YYYY-MM-dd HH:mm:ss 对应 2020-12-30 00:00:00
YYYY-MM-dd hh:mm:ss 对应 2019-12-30 12:00:00

也就是说yyyy与YYYY输出的年份不一致。

从上边的结果看,发现同一个日期按 "yyyy-MM-dd HH:mm:ss” 与 "YYYY-MM-dd HH:mm:ss” 格式化后,得到的可能不一致。

原因:

YYYY 代表 Week Year

yyyy 代表year

再看下解析:

    @Test
    public void should_get_date_when_given_string() throws Exception {
        Date timeLower = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-12-30 00:00:00");
        Date timeUpper = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").parse("2019-12-30 00:00:00");

        System.out.println("yyyy-MM-dd HH:mm:ss" + " 对应 " + timeLower.toString());
        System.out.println("YYYY-MM-dd HH:mm:ss" + " 对应 " + timeUpper.toString());


        Date timeForHourLower = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2019-12-30 00:00:00");
        System.out.println("YYYY-MM-dd hh:mm:ss" + " 对应 " + timeForHourLower.toString());
    }

此时解析的结果如下:

yyyy-MM-dd HH:mm:ss 对应 Mon Dec 30 00:00:00 CST 2019
YYYY-MM-dd HH:mm:ss 对应 Sun Dec 30 00:00:00 CST 2018
YYYY-MM-dd hh:mm:ss 对应 Mon Dec 30 00:00:00 CST 2019

这次更离谱

这里补充一下,Oracle里不区分大小写,对应的 yyyy-MM-dd HH24:mi:ss代表24小时制,yyyy-MM-dd HH:mi:ss 代表12小时制。

HH代表24小时制

hh代表12小时制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值