Search code examples
javacalendargregorian-calendar

GegorianCalendar is giving me 2018 for int month = calendar.get(Calendar.FEBUARY)


So Im working on an Calendar programm and to change the Months im asking for the int of the month.

If I type calendar.get(Calendar.JANUARY) i get 1 as return, which is correct because first month. But if I type calendar.get(Calendar.FEBUARY) i get 2018 in respond which of course is wrong. Does anyone know what the problem could be?

Calendar cal1 = new GregorianCalendar();
int month = cal1.get(Calendar.JANUARY);
int month2 = cal1.get(Calendar.FEBRUARY);
int year = cal1.get(Calendar.YEAR);

Solution

  • java.time

    T.J. Crowder’s answer is correct. Allow me to supply the real, good and modern solution to your problem.

        ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Atlantic/Stanley"));
        // 2018-05-21T05:02:23.942763-03:00[Atlantic/Stanley]
        Month monthEnum = zdt.getMonth(); // MAY
        int monthNumber = zdt.getMonthValue(); // 5
        int year = zdt.getYear(); // 2018
    

    I ran the code just now and have given results in comments after each code line. Please put your desired time zone where I have put Atlantic/Stanley since the month does not change at the same point in time in different time zones. Do you agree with me that this code is clearer and more natural and leaves less room for confusion? BTW, if you’re only interested in the date, not the time of day, use LocalDate instead of ZonedDateTime, the rest of the code will be the same.

    To get the numbers of specific months:

        int januaryNumber = Month.JANUARY.getValue(); // 1
        int februaryNumber = Month.FEBRUARY.getValue(); // 2
    

    What happened in your code?

    As T.J. Crowder has already said, Calendar.get expects a field number, for example Calendar.MONTH or Calendar.YEAR. Calendar.JANUARY is 0. Zero?! It’s another confusing thing about Calendar, month numbers are 0-based, that is, they go from 0 for January through 11 for December. Anyway, 0 is also the field number of Calendar.ERA. GregorianCalendar uses 0 for BC (or more religion neutral: BCE for before common era) and 1 for AD (CE, common era). Since your date is in the common era, you get 1. Which, by the way, would have been incorrect for month of January since months are 0-based.

    Similarly, Calendar.FEBRUARY equals 1 and coincides with field number Calendar.YEAR, which I why you got the year.

    Links