Alex Sim
Alex Sim

Reputation: 647

Date using 'YYYY'

This is a question related to Java Date year calculation is off by year for two days

I understand the problem appeared from using 'YYYY' instead of 'yyyy', whereby 'YYYY' refers to calendar year instead of the actual year, resulting in the year being wrong if the dates fell onto the first week of January's calendar year.

I tried to read further and understand the problem in

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

And it says

"A week year is in sync with a WEEK_OF_YEAR cycle. All weeks between the first and last weeks (inclusive) have the same week year value. Therefore, the first and last days of a week year may have different calendar year values."

I have been trying to see if there are any time of the year where 01-Jan-XXXX is actually displayed as 01-Jan-(XXXX-1) but have not managed to find any. Is there a case where this may happen?

I did something simple to take string dates and print out using YYYYMMdd format

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);

}

And the output was

First day of the week: 1

Minimal Days in First Week: 1

Week Number: 1

Date: 20161231

If I change the date to "01/01/2016"

The output was

First day of the week: 1

Minimal Days in First Week: 1

Week Number: 1

Date: 20160101

So 01/01/2016 is the first week of of 2016, and not week 53 of 2015.

Upvotes: 1

Views: 308

Answers (3)

Anonymous
Anonymous

Reputation: 86296

For a concrete answer, the following table shows January 1 for each year from 2010 through 2020 with day-of-week, week-based year and week number in ISO (the international standard) and in the US.

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

As you can see, internationally January 1 regularly falls in week 52 or 53 of the previous year, while in the US it always falls in week 1 of its own year.

International rule: Week 1 is the first one that contains at least 4 days of the new year. In other words, a week belongs in the year where most of its days are. In yet other words, week 1 is the one that holds the first Thursday of the year (since weeks begin on Mondays). This implies that when January 1 is a Friday, Saturday or Sunday, it belongs to the last week of the previous year.

US rule: Week 1 is the week that contains January 1. That January 1 always falls in week 1 of its own year follows from this definition (weeks begin on Sundays).

The table came out of this snippet:

    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()));
    }

I am of course using java.time, the modern Java date and time API. I warmly recommend it over the outdated Calendar, SimpleDateFormat and Date.

Upvotes: 1

Andreas
Andreas

Reputation: 159114

In the US, the first week of the year is defined as being the week containing January 1*.

As a consequence, the week-year for January 1 will always be the same as the calendar year, in the US.

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

Upvotes: 1

Martin Schneider
Martin Schneider

Reputation: 3268

No. The week year is only to be used in conjunction with the week. For example the 1st January 2016 (a Friday) is in the 53. week of 2015. It will never be displayed as 1. January 2015 since that would be ambiguous.

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"

Upvotes: 1

Related Questions