Search code examples
javamethodsprintingcalendarjava.util.calendar

Set method for Java Calendar only works if I do a print of it


I am facing a problem I really don't understand. I am trying to use the set method on a Calendar but it modifies the values only if I print it, here is the code:

Calendar cal = Calendar.getInstance();
cal.set(2020,2,31);
// System.out.println("Necessary print: " + cal.getTime());

cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
// reset time
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);

System.out.println("Date set: " + cal.getTime());
System.out.println("Day of month: " + cal.get(Calendar.DAY_OF_MONTH));

This previous code gives me the output:

Date set: Mon Mar 02 00:00:00 CET 2020
Day of month: 2

And if I uncomment the "necessary print", then I get:

Necessary print: Tue Mar 31 23:07:17 CEST 2020
Date set: Mon Mar 30 00:00:00 CEST 2020
Day of month: 30

I'm really wondering why a print can affect this method, thanks in advance for help! 😅


Solution

  • The documentation of the Calendar class states:

    The calendar fields can be changed using three methods: set(), add(), and roll(). set(f, value) changes calendar field f to value. In addition, it sets an internal member variable to indicate that calendar field f has been changed. Although calendar field f is changed immediately, the calendar's time value in milliseconds is not recomputed until the next call to get(), getTime(), getTimeInMillis(), add(), or roll() is made. Thus, multiple calls to set() do not trigger multiple, unnecessary computations. As a result of changing a calendar field using set(), other calendar fields may also change, depending on the calendar field, the calendar field value, and the calendar system. In addition, get(f) will not necessarily return value set by the call to the set method after the calendar fields have been recomputed. The specifics are determined by the concrete calendar class.

    TL;DR: You need to call cal.getTime() to update the values.