Search code examples
javaandroidunix-timestampandroid-calendarjava.util.calendar

Calendar.setTimeInMillis error - why is that?


calendar gets wrong unix time as I got.

long millis = 1568814839L;
System.out.println(millis); //1568814839
Calendar.getInstance(TimeZone.getTimeZone("Asia/Tashkent"));
calendar.setTimeInMillis(millis);
System.out.println(calendar.get(Calendar.MILLISECOND));//839

What should I do? Calendar.YEAR should be 2019 with that millis. However, calendar gives me 1970, why?


Solution

  • The error is due to you confusing time in milliseconds and time in seconds. 1568814839L is the number of seconds since 1/1/1970, but you're treating it as milliseconds. This is quite easy to check:

    long millis = 1568814839L;
    System.out.println(millis); //1568814839
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tashkent"));
    System.out.println(calendar.getTimeInMillis()); //1568820981321
    calendar.setTimeInMillis(millis);
    System.out.println(calendar.get(Calendar.YEAR));//839
    

    This will produce:

    1568814839
    1568820981321
    1970
    

    As you can see, your number is 3 orders of magnitude off. Add three 0's to the end of your millis number:

    long millis = 1568814839000L;
    ...
    System.out.println(calendar.get(Calendar.YEAR));
    

    Now you get:

    1568814839000
    1568821211006
    2019