Search code examples
javadatexmlgregoriancalendar

java XMLGregorianCalendar shows different year on conversion


Simple test case below is giving results different than expected.

import javax.xml.datatype.XMLGregorianCalendar;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Main {
    public static void main(String[] args) {

            XMLGregorianCalendar xmlDate = new XMLGregorianCalendarImpl();
            xmlDate.setMonth(12);
            xmlDate.setDay(31);
            xmlDate.setYear(2019);
            xmlDate.setHour(0);
            xmlDate.setMinute(0);
            xmlDate.setSecond(0);
            Calendar calendar = xmlDate.toGregorianCalendar();
            SimpleDateFormat formatter = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
            Date dt = calendar.getTime();
           String ds1 = dt.toString();
           System.out.println("ds1 = " + ds1);
           String dateString = formatter.format(calendar.getTime());
           System.out.println("dateString = " + dateString );

    }
}

I cannot figure out why the year component of dateString is showing as 2020 instead of 2019.

ds1 = Tue Dec 31 00:00:00 EST 2019
dateString = 2020-12-31 00:00:00

Solution

  • Please change your code to

    import javax.xml.datatype.XMLGregorianCalendar;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    public class Main {
        public static void main(String[] args) {
    
                XMLGregorianCalendar xmlDate = new XMLGregorianCalendarImpl();
                xmlDate.setMonth(12);
                xmlDate.setDay(31);
                xmlDate.setYear(2019);
                xmlDate.setHour(0);
                xmlDate.setMinute(0);
                xmlDate.setSecond(0);
                Calendar calendar = xmlDate.toGregorianCalendar();
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date dt = calendar.getTime();
               String ds1 = dt.toString();
               System.out.println("ds1 = " + ds1);
               String dateString = formatter.format(calendar.getTime());
               System.out.println("dateString = " + dateString );
    
        }
    }
    

    As YYYY represents year of the week and yyyy represents calendar year in simple date format.

    More explanation here: Java SimpleDateFormat shifts Date by one year