У меня есть экземпляр календаря в григорианском стиле с использованием определенного часового пояса. Я установил дату календаря в 1970-01-01. Когда я получаю год, месяц, день поля, они отличаются от того, что я их установил.Почему класс java.util.Calendar дает неверную дату на Android?
Если я запускаю этот код на андроид устройство печатает «1969-11-31»
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("America/Bahia_Banderas"));
cal.clear();
cal.set(1970, 0, 1);
// Should print "1970-0-1" but prints "1969-11-31"
android.util.Log.i("date", cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" + cal.get(Calendar.DAY_OF_MONTH));
Однако, работает один и тот же код на чистом Java он работает, как ожидалось.
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("America/Bahia_Banderas"));
cal.clear();
cal.set(1970, 0, 1);
// Prints "1970-0-1" as expected
System.out.println(cal.get(Calendar.YEAR) + "-" + cal.get(Calendar.MONTH) + "-" + cal.get(Calendar.DAY_OF_MONTH));
я читал в классе Calendar в bug, который, казалось, связано с моей проблемой. Я попробовал обходное решение, упомянутое в отчете об ошибке, но это не сработало для меня. Самое странное, однако, состоит в том, что один и тот же класс ведет себя по-разному на Android и на чистой Java. Я хочу, чтобы экземпляр календаря вернул правильную дату после того, как я его установил. Вы знаете, как достичь этого?
Упс - реализация Android также очищает флаг 'isTimeSet', это просто на той же строке с другой булевой отметкой флага. У меня нет времени, чтобы заглянуть в это глубже. Во всяком случае, общая идея UTC + 6 сохраняется; просто не объяснение разницы между Android и обычной Java. – laalto