【问题标题】:Difference between 'yy' and 'YY' in Java Time Pattern [duplicate]Java时间模式中'yy'和'YY'之间的区别[重复]
【发布时间】:2020-04-19 00:13:13
【问题描述】:

从文档SimpleDateTimePatternyy应该和YY一样。

今天是Dec 30, 2019,现在我们得到YY,今天是20yy,今天是19。 Java 时间模式中的yyYY 有什么区别?

【问题讨论】:

  • 我建议使用java.time API 而不是遗留库
  • @YCF_L yY 的区别同样适用于java.time.format.DateTimeFormatter
  • @MarkRotteveel 是的,我知道,我将该评论提交给 OP 以避免使用遗留库。
  • 我建议你不要使用SimpleDateFormat。这个类是出了名的麻烦而且已经过时了。而是使用DateTimeFormatterjava.time, the modern Java date and time API 中的其他类。

标签: java time simpledateformat


【解决方案1】:

yy 是日历年,而YY 是一周年。一周年可能与日历年不同,具体取决于一月的第一天。例如参见ISO-8601 week year

今天(2019 年 12 月 30 日)就是一个很好的例子,日历年是 2019 年,但周年是 2020 年,因为本周是 2020 年的第 1 周。所以yy 将导致19,而@987654327 @结果为20

一年中第一周的定义来自wikipedia page

第 1 周的 ISO 8601 定义是使用公历的那一周 一年的第一个星期四在里面。以下定义基于 这周的属性是相互等价的,因为 ISO 周 从星期一开始:

  • 这是第一周,大部分(4 天或更多)天在 1 月。
  • 第一天是最接近 1 月 1 日的星期一。
  • 其中有 4 月 4 日。因此,最早可能的第一周从 12 月 29 日星期一(上一个公历年)延长到 4 日星期日 1 月,最迟可能的第一周从 1 月 4 日星期一开始 至 1 月 10 日星期日。
  • 如果星期六、星期日和 1 月 1 日不是工作日,则其中包含一年的第一个工作日。

如果 1 月 1 日是星期一、星期二、星期三或星期四,则它在 第 01 周。如果 1 月 1 日是星期五,那么它是第 53 周的一部分 前一年。如果是星期六,则为最后一周的一部分 上一年在普通年份中编号为 52,在普通年份中编号为 53 闰年。如果是周日,则为前一周第 52 周的一部分 年。

某些地区(例如美国)不遵循 ISO-8601,因为它们使用星期日作为一周的第一天,但​​他们对一周年份有类似的规则。

【讨论】:

    【解决方案2】:

    它们都代表一年,但 yyyy 代表日历年,而 YYYY 表示一周中的年份。

    一个例子比文字更能说明这一点。

    package datetest;    
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class Test {
    
        public static void main(String[] args) {
            try {
                String[] dates = {"2018-12-01", "2018-12-31", "2019-01-01"};
                for (String date: dates) {
                    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                    Date d = dt.parse(date);
    
                    SimpleDateFormat dtYYYY = new SimpleDateFormat("YYYY");
                    SimpleDateFormat dtyyyy = new SimpleDateFormat("yyyy");
    
                    System.out.println("For date :" + date + " the YYYY year is : " + dtYYYY.format(d) + " while for yyyy it's " + dtyyyy.format(d));
                }
            } catch (Exception e) {
                System.out.println("Failed with exception: " + e);
            }
        }
    }
    

    输出

    For date : 2018-12-01 the YYYY year is : 2018 while for yyyy it's 2018
    For date : 2018-12-31 the YYYY year is : 2019 while for yyyy it's 2018
    For date : 2019-01-01 the YYYY year is : 2019 while for yyyy it's 2019
    

    【讨论】:

      【解决方案3】:

      你有它在你的链接:

      y 年份 1996 年; 96

      Y 周年 2009 年; 09

      周年可以不同,例如这个新年周与当年

      Week year 定义为一年的第一个星期四

      一年的第一周是包含该年第一个星期四的那一周

      【讨论】:

        猜你喜欢
        • 2018-10-13
        • 1970-01-01
        • 2014-06-25
        • 2011-04-23
        • 1970-01-01
        • 2012-04-04
        • 1970-01-01
        • 2014-08-16
        • 2011-04-08
        相关资源
        最近更新 更多