zoukankan      html  css  js  c++  java
  • Java时间转换,日期格式化使用 YYYY-MM-dd 的潜在问题

    日期格式化使用 YYYY-MM-dd 的潜在问题

    • 测试逻辑:
      1. 创建两个日期格式化,一个是出问题的YYYY-MM-dd,另一个是正确用法yyyy-MM-dd
      2. 分别去格式化两个不同的日期:2020年12月26日(周六),2020年12月27日(周日)
    • 代码如下
    @Test
        public void dateTest() {
            // 指定了两个时间
    
            // 通过指定具体的 年月日时分秒 构建 一个 LocalDateTime 对象(无时区), 绑定 到 北京时区,转为 实例,构建Date 对象
            test(Date.from(LocalDateTime.of(2020,12,27,12,1,35).atZone(ZoneId.of("Asia/Shanghai")).toInstant()));
            test(Date.from(LocalDateTime.of(2020,12,26,12,1,35).atZone(ZoneId.of("Asia/Shanghai")).toInstant()));
    
        }
    
        private void test(Date date) {
            String loY = "yyyy-MM-dd HH:mm:ss";
            String upY = "YYYY-MM-dd HH:mm:ss";
            SimpleDateFormat loF = new SimpleDateFormat(loY);
            SimpleDateFormat upF = new SimpleDateFormat(upY);
            System.out.println("小Y格式化:" + loF.format(date));
            System.out.println("大Y格式化:" + upF.format(date));
            System.out.println("===========================");
        }
    
    • 代码运行结果

    小Y格式化:2020-12-27 12:01:35
    大Y格式化:2021-12-27 12:01:35
    ===========================
    小Y格式化:2020-12-26 12:01:35
    大Y格式化:2020-12-26 12:01:35
    ===========================

    • 结果分析
      发现当日期为 2020-12-27 时,两个 SimpleDateFormat 对象的转换的出来年份不一样,原因时一个的样式使用的 年份的 标识不同 "YYYY" 和 "yyyy"
      具体原因时,"Y"是表示周年,表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年
      对于周年的具体解释:

      参考:GregorianCalendar#getWeekYear() 这个方法上的注释
      返回此公历所代表的周年。从“1”到“最大周数”之间的周中的日期具有相同的“周年”值,可以是“年(日历年)”值的前一年,也可以是“年(日历年)”值的后一年。
      此方法在计算周年之前调用

      就是说对于年份的区分,是把一年的天数,分成多少周(能整除的天数,就算这个周年表示的年份和当前的公历年份相同),后面多余不满一周当年的多余天数的就表示是下一个周年(就是当前公历年份的下一年)

    • 说明
      这里为了举例方便使用了 SimpleDateFormat 类,但是该类是线程不安全得,已经不推荐使用,需要特别注意,建议使用 DateTimeFormatter 类进行时间格式化

    • SimpleDateFormat 类上的注释中的一些说明

    Letter Date or Time Component Presentation Examples
    G Era designator Text AD
    y Year Year 1996; 96
    Y Week year Year 2009; 09
    M Month in year (context sensitive) Month July; Jul; 07
    L Month in year (standalone form) Month July; Jul; 07
    w Week in year Number 27
    W Week in month Number 2
    D Day in year Number 189
    d Day in month Number 10
    F Day of week in month Number 2
    E Day name in week Text Tuesday; Tue
    u Day number of week (1 = Monday, ..., 7 = Sunday) Number 1
    a Am/pm marker Text PM
    H Hour in day (0-23) Number 0
    k Hour in day (1-24) Number 24
    K Hour in am/pm (0-11) Number 0
    h Hour in am/pm (1-12) Number 12
    m Minute in hour Number 30
    s Second in minute Number 55
    S Millisecond Number 978
    z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
    Z Time zone RFC 822 time zone -0800
    X Time zone ISO 8601 time zone -08; -0800; -08:00
  • 相关阅读:
    How to create jar for Android Library Project
    Very large tabs in eclipse panes on Ubuntu
    64bit Ubuntu, Android AAPT, R.java
    Linux(Ubuntu)下如何安装JDK
    Configure xterm Fonts and Colors for Your Eyeball
    建立、配置和使用Activity——启动其他Activity并返回结果
    建立、配置和使用Activity——使用Bundle在Activity之间交换数据
    建立、配置和使用Activity——启动、关闭Activity
    建立、配置和使用Activity——Activity
    异步任务(AsyncTask)
  • 原文地址:https://www.cnblogs.com/kzcming/p/14326359.html
Copyright © 2011-2022 走看看