日期使用' YYYY'

时间:2018-01-10 07:40:42

标签: java date calendar

这是与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

它说

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

我一直试图查看一年中是否有任何时间01-Jan-XXXX实际显示为01-Jan-(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

如果我将日期更改为" 01/01/2016"

输出

一周的第一天:1

第一周的最小日子:1

周数: 1

日期:20160101

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

3 个答案:

答案 0 :(得分:1)

没有。周年仅与本周一起使用。例如,2016年1月1日(星期五)是在2015年的53.周。它将永远不会显示为2015年1月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"

答案 1 :(得分:1)

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

因此,1月1日的周年始终与日历年相同,在美国

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

答案 2 :(得分:1)

对于具体答案,下表显示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周是第一个包含新年至少4天的第1周。换句话说,一个星期属于其大部分时间都在的那一年。换句话说,第1周是持有一年中第一个星期四的那个星期(自周一开始以来的星期几)。这意味着当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日期和时间API java.time。我热烈推荐过时的CalendarSimpleDateFormatDate