2015-03-27 2 views
1

Я использую строки кода:Клиринговый Calendar.HOUR добавляет сотни дней

1 GregorianCalendar cal = (GregorianCalendar) date.clone(); 
2 cal.clear(Calendar.HOUR); 

При использовании этого кода в модульном тесте - он работает просто отлично. Однако при запуске на моем устройстве Android он, похоже, сломается. Вот что говорит мой отладчик:

После линии 1: cal.getTimeInMillis() = 1426022494179
После линии 2: cal.getTimeInMillis() = 1450905694179

Я также попытался cal.set(Calendar.HOUR, 0) и он делает то же самое.

EDIT: После некоторого тестирования, оказывается, что установка или очистка ничего на объекте кала сразу ставит меня на 24 декабря года, вы в настоящее время, однако, как только начальный переход на Dec 24 происходит, Календарь. затем действует нормально.

+0

Любая вероятность того, что вы настаиваете на использовании 'clone()', заключается в том, что вы фактически используете (пользовательский) подкласс 'GregorianCalendar'? Объекты «Календарь» хранят поля отдельно от фактического объекта даты, и не каждая операция синхронизирует их все время, особенно нет, если вы создали свой собственный подкласс, который делает кто-знает-что. –

+0

Нет - я использую GregorianCalendar из Android SDK 21. – Zambezi

ответ

1

Я нашел этот вопрос. Оказывается, у Android SDK 21 есть ошибка - при использовании getActualMaximum (Calendar.WEEK_OF_YEAR) в GregorianCalendar он помещает объект в состояние, так что если вы используете вызов set() перед вызовом get(), он будет помещать вашу дату до 31 или 23 декабря (в зависимости от года).

+1

Я почти не поверил тебе. Протестировал его, воспроизвел, проверил код. Теперь я тебе верю. Остерегайтесь «Календарь» ... –

0

Попробуйте это:

 Calendar cal4 = Calendar.getInstance(); 
     cal4.setTime((Date)d.clone()); // <-- Update 
     Log.d(TAG,"cal4 time: " + cal4.getTime().toString()); 

     cal4.set(Calendar.HOUR_OF_DAY, 0); 

     Log.d(TAG,"cal4 time: " + cal4.getTime().toString()); 

Выход:

cal4 time: Fri Mar 27 19:02:55 EDT 2015 
cal4 time: Fri Mar 27 00:02:55 EDT 2015 
+0

Время, которое я получаю: Вт 17 мар 04:29:16 GMT + 13: 00 2015 Чт Дек 24 00:29:16 GMT +13: 00 2015 – Zambezi

+0

Попробуйте запустив мой точный код, дата в вашем ответе не отражает того, что вы пробовали. –

+0

Ваш код работает. Я получаю правильный день. (Тем не менее - мне все еще нужно работать с клоном. Я не могу получить экземпляр Календаря - эта функция должна работать с любой заданной датой) – Zambezi