震惊!java中日期格式化的大坑!

简介: 震惊!java中日期格式化的大坑!

前言

我们都知道在java中进行日期格式化使用simpledateformat。通过格式 yyyy-MM-dd 等来进行格式化,但是你知道其中微小的坑吗?

yyyy 和 YYYY

示例代码

    @Test
    public void testWeekBasedYear() {
        Calendar calendar = Calendar.getInstance();
        // 2019-12-31
        calendar.set(2019, Calendar.DECEMBER, 31);
        Date strDate1 = calendar.getTime();
        // 2020-01-01
        calendar.set(2020, Calendar.JANUARY, 1);
        Date strDate2 = calendar.getTime();
        // 大写 YYYY
        SimpleDateFormat formatYYYY = new SimpleDateFormat("YYYY/MM/dd");
        System.out.println("2019-12-31 转 YYYY/MM/dd 格式: " + formatYYYY.format(strDate1));
        System.out.println("2020-01-01 转 YYYY/MM/dd 格式: " + formatYYYY.format(strDate2));
        // 小写 YYYY
        SimpleDateFormat formatyyyy = new SimpleDateFormat("yyyy/MM/dd");
        System.out.println("2019-12-31 转 yyyy/MM/dd 格式: " + formatyyyy.format(strDate1));
        System.out.println("2020-01-01 转 yyyy/MM/dd 格式: " + formatyyyy.format(strDate2));
    }

输出的结果

2019-12-31 转 YYYY/MM/dd 格式: 2020/12/31
2020-01-01 转 YYYY/MM/dd 格式: 2020/01/01
2019-12-31 转 yyyy/MM/dd 格式: 2019/12/31
2020-01-01 转 yyyy/MM/dd 格式: 2020/01/01

卧槽?2019变成2020了?

YYYY 是怎么做到的呢

Java's DateTimeFormatter pattern "YYYY" gives you the week-based-year, (by default, ISO-8601 standard) the year of the Thursday of that week.
下面就是用YYYY格式化代码

12/29/2019 将会格式化到2019年 这一周还属于2019年
12/30/2019 将会格式化到2020年 这一周已经属于2020年
看字说话YYYY,week-based year 是 ISO 8601 规定的。
2019-12-31号这一天,按周算年份已经属于2020年了,格式化之后就变成2020年,后面的月份日期不变。

dd和DD

示例代码

  private static void tryit(int Y, int M, int D, String pat) {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pat);
        LocalDate         dat = LocalDate.of(Y,M,D);
        String            str = fmt.format(dat);
        System.out.printf("Y=%04d M=%02d D=%02d " +
            "formatted with " +
            "\"%s\" -> %s\n",Y,M,D,pat,str);
    }
    public static void main(String[] args){
        tryit(2020,01,20,"MM/DD/YYYY");
        tryit(2020,01,21,"DD/MM/YYYY");
        tryit(2020,01,22,"YYYY-MM-DD");
        tryit(2020,03,17,"MM/DD/YYYY");
        tryit(2020,03,18,"DD/MM/YYYY");
        tryit(2020,03,19,"YYYY-MM-DD");
    }

输出结果

Y=2020 M=01 D=20 formatted with "MM/DD/YYYY" -> 01/20/2020
Y=2020 M=01 D=21 formatted with "DD/MM/YYYY" -> 21/01/2020
Y=2020 M=01 D=22 formatted with "YYYY-MM-DD" -> 2020-01-22
Y=2020 M=03 D=17 formatted with "MM/DD/YYYY" -> 03/77/2020
Y=2020 M=03 D=18 formatted with "DD/MM/YYYY" -> 78/03/2020
Y=2020 M=03 D=19 formatted with "YYYY-MM-DD" -> 2020-03-79

这里的大写的DD代表的是处于这一年中那一天,不是处于这个月的那一天,但是dd就没有问题。

结论

格式化日期一定要选用 yyyy-MM-dd哦!

相关文章
|
2月前
|
JSON 前端开发 Java
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
146 1
震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
|
4月前
|
Java 数据库
震惊!Guava Throwables 类如魔法棒般神奇,让 Java 异常处理华丽变身!
【8月更文挑战第29天】在 Java 开发中,异常处理至关重要,而 Guava 库中的 `Throwables` 类则提供了强大的异常处理工具。它包含了一系列静态方法,如 `propagateIfInstanceOf` 和 `propagateIfPossible`,可以帮助我们有条件地传播异常。此外,`getRootCause` 方法可以深入分析异常的根本原因,有助于快速定位问题所在。无论是构建大型分布式系统还是电商平台,`Throwables` 类都能显著提升异常处理的效率和准确性,使我们的程序更加稳定和可靠。
46 1
|
4月前
|
安全 Java
java系列知识之~SimpleDateFormat日期格式化
这篇文章介绍了Java中`SimpleDateFormat`类的使用,包括如何创建实例、格式化日期对象为字符串、解析字符串为日期对象,并提供了常见日期模式和使用示例,同时指出了`SimpleDateFormat`不是线程安全及其它一些注意事项。
|
6月前
|
Java 开发者
震惊!Java命名规范背后的惊天秘密,你真的了解吗?
【6月更文挑战第15天】Java命名规范提升代码可读性。标识符须以字母、下划线或$开头,避免数字开头。变量用camelCase,如`myVariable`;类与方法用PascalCase,如`MyClass`和`myMethod`。常量全大写加下划线,如`MAX_VALUE`。避免关键字冲突,确保可维护性。
45 10
|
6月前
|
Java
震惊!Java子类竟能“继承”父类财富,还能“自立门户”添新招!
【6月更文挑战第16天】Java的继承支持类的层次结构,子类(如`SportsCar`)继承父类(如`Car`)的属性和方法。`SportsCar`不仅拥有`Car`的基本功能,还能添加独特属性(如最高时速、加速时间)和方法(如氮气加速),并能重写父类方法以扩展功能。此机制促进代码复用,提高效率。例如,`SportsCar`调用`super.accelerate()`执行基本加速,并添加跑车特有的加速效果。
43 8
|
6月前
|
Java 开发者
震惊!Java多线程的惊天秘密:你真的会创建线程吗?
【6月更文挑战第19天】Java多线程创建有两种主要方式:继承Thread类和实现Runnable接口。继承Thread限制了多重继承,适合简单场景;实现Runnable接口更灵活,可与其它继承结合,是更常见选择。了解其差异对于高效、健壮的多线程编程至关重要。
36 2
|
6月前
|
存储 Java
震惊!关系运算符在 Java 基本语法中竟然这么重要!
【6月更文挑战第14天】Java 中的关系运算符在编程中扮演关键角色。通过案例展示了它们的用法:比较数值大小、判断字符串相等、执行多重关系判断、在循环和条件语句中的应用,以及与其他运算符结合使用。理解并熟练运用这些运算符,能有效控制程序流程,实现复杂逻辑,是构建 Java 代码基础的重要部分。
28 1
|
7月前
|
存储 Java C语言
Java的缓冲区与格式化输出技术详解
Java的缓冲区与格式化输出技术详解
64 2
|
6月前
|
存储 缓存 安全
震惊!Java Map竟然隐藏了这么多黑科技,你了解多少?
【6月更文挑战第18天】Java Map是高效的数据结构,用于键值对存储。并发时,ConcurrentHashMap通过分段锁或CAS保证安全。Java 8引入Stream API,允许流式处理Map进行复杂计算。TreeMap提供排序功能,而自定义Map实现能扩展功能,如自动过期或LRU缓存。Map的深度探索揭示了其强大潜力。
177 0
|
6月前
|
算法 Java 开发者
震惊!你的Java代码还可以这样写:深入抽象类与接口的世界!
【6月更文挑战第17天】在Java编程中,抽象类与接口如双子星座般引领开发。通过抽象类`Shape`实现形状的共性,如颜色和抽象方法`getArea()`,展示多态性;接口`PerimeterCalculator`则在不修改`Shape`的基础上,允许`Circle`和`Rectangle`添加计算周长功能,体现扩展性。两者结合,助力构建优雅、灵活的程序结构。
35 0