代码之家  ›  专栏  ›  技术社区  ›  Alex Sim

使用“YYYY”的日期

  •  1
  • Alex Sim  · 技术社区  · 7 年前

    这是一个与 Java Date year calculation is off by year for two days

    我理解使用“YYYY”而不是“YYYY”时出现的问题,即“YYYY”指的是日历年而不是实际年份,如果日期落在1月份日历年的第一周,则会导致年份错误。

    我试图进一步阅读并理解

    https://docs.oracle.com/javase/9/docs/api/java/util/GregorianCalendar.html#week_year

    上面写着

    “周-年与周-年周期同步。第一周和最后一周(含)之间的所有周都具有相同的周-年值。 因此,一周中的第一天和最后一天可能具有不同的日历年值。 "

    我一直在尝试查看一年中是否有任何时间1月1日XXXX实际显示为1月1日-(XXXX-1),但没有找到任何时间。是否有可能发生这种情况?

    我做了一些简单的事情,用YYYYMMdd格式获取字符串日期并打印出来

    public static void main(String[] args) throws ParseException
    {
        Calendar testCalendar = Calendar.getInstance();
        System.out.println("First day of the week: " + testCalendar.getFirstDayOfWeek());
        System.out.println("Minimal Days in First Week: " + testCalendar.getMinimalDaysInFirstWeek());
        SimpleDateFormat YYYYMMdd= new SimpleDateFormat("YYYYMMdd");
        String dateString = "01/01/2016";
        Date date = new Date();
        date = new SimpleDateFormat("dd/MM/yyyy").parse(dateString);
        testCalendar.setTime(date);
        int week = testCalendar.get(Calendar.WEEK_OF_YEAR);
        String date2 = YYYYMMdd.format(date);
        System.out.println("Week Number: " + week);
        System.out.println("Date: " + date2);
    
    }
    

    输出为

    每周第一天:1

    第一周最少天数:1

    周数:1

    日期: 2016 1231

    如果我将日期更改为“2016年1月1日”

    输出为

    每周第一天:1

    第一周最少天数:1

    周数: 1.

    日期:20160101

    因此,2016年1月1日是2016年的第一周,而不是2015年的第53周。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Valentin Michalak    7 年前

    对于具体答案,下表显示了从2010年到2020年的每年1月1日,以及ISO(国际标准)和美国的周数、周数和年数。

    Year  DOW  ISO      US
    2010  Fri  2009-53  2010-01
    2011  Sat  2010-52  2011-01
    2012  Sun  2011-52  2012-01
    2013  Tue  2013-01  2013-01
    2014  Wed  2014-01  2014-01
    2015  Thu  2015-01  2015-01
    2016  Fri  2015-53  2016-01
    2017  Sun  2016-52  2017-01
    2018  Mon  2018-01  2018-01
    2019  Tue  2019-01  2019-01
    2020  Wed  2020-01  2020-01
    

    正如你所见,在国际上,1月1日通常是前一年的第52周或第53周,而在美国,1月1日总是在其所在年份的第1周。

    国际规则:第一周是新年中第一个至少包含4天的时间。换言之,一周属于一年中的大部分日子。换言之,第一周是一年中第一个星期四(从星期一开始)。这意味着,当1月1日是星期五、星期六或星期日时,它属于前一年的最后一周。

    美国规则:第1周是包含1月1日的一周。1月1日总是在其所在年份的第1周,这一定义如下(周从周日开始)。

    该表来自以下代码片段:

        System.out.println("Year  DOW  ISO      US");
        for (int year = 2010; year <= 2020; year++) {
            LocalDate jan1 = LocalDate.of(year, Month.JANUARY   , 1);
            System.out.format(Locale.ROOT, "%4d  %3s  %4d-%02d  %4d-%02d%n",
                    year, jan1.getDayOfWeek().getDisplayName(TextStyle.SHORT_STANDALONE, Locale.ROOT), 
                    jan1.get(WeekFields.ISO.weekBasedYear()), jan1.get(WeekFields.ISO.weekOfWeekBasedYear()), 
                    jan1.get(WeekFields.SUNDAY_START.weekBasedYear()), jan1.get(WeekFields.SUNDAY_START.weekOfWeekBasedYear()));
        }
    

    我当然在使用 java.time ,现代Java日期和时间API。我热烈推荐它胜过过时的 Calendar , SimpleDateFormat Date .

        2
  •  1
  •   Martin Schneider    7 年前

    否。周-年只能与周一起使用。例如,2016年1月1日(星期五)是53。2015年第二周。它永远不会显示为1。2015年1月,因为这将是不明确的。

    Calendar d = Calendar.getInstance();
    d.set(Calendar.YEAR, 2016)
    d.set(Calendar.MONTH, Calendar.JANUARY);
    d.set(Calendar.DATE, 1);
    
    SimpleDateFormat ft = new SimpleDateFormat("w-YYYY");
    ft.format(d.getTime()); 
    // => "53-2015"
    
        3
  •  1
  •   Andreas dfa    7 年前

    在美国,一年中的第一周被定义为包含1月1日的一周 * .

    因此,1月1日的一周将 总是 与日历年相同, 在美国 .

    * https://en.wikipedia.org/wiki/Week#Week_numbering

    推荐文章