Не похоже, что этот вопрос возник до этого, поэтому я попрошу его здесь: Ожидается ли «мелкое» копирование Календаря через Calendar.clone() что сохраненные миллисекунды становятся недействительными?Calendar.clone() Неправильное копирование миллисекунд
Я спрашиваю, потому что следующий фрагмент кода не удается:
public boolean someFunc(Calendar prevTime, Calendar proposal) {
int submissionMinuteThreshold = 30;
boolean isAfterMinTime;
...
Calendar min = (GregorianCalendar) prevTime.clone();
Log.i("PROJ", "1. Proposed time = " + proposal.getTimeInMillis() + ", min time = " + min.getTimeInMillis());
min.add(Calendar.MINUTE, submissionMinuteThreshold);
Log.i("PROJ", "2. Proposed time = " + proposal.getTimeInMillis() + ", min time = " + min.getTimeInMillis());
isAfterMinTime = proposal.after(min); // returns true even though min is 29 minutes later
Я экспериментировал со следующими параметрами: proposal
= 10:34 утра на 2014-10-25 prevTime
= 10:33 АМ на 2014-10-25
выход Log показан ниже:
- Предлагаемое время = 1414247640000, мин время = -61180824420000
- Предлагаемое время = 1414247640000, мин Время = -61180822620000
После просмотра полей min
в отладчике, я вижу, что add
правильно устанавливает час 11 минут до 03, и дата 2014- 10-25, так что кажется, что add
работает правильно. Однако, когда сравнение выполняется, миллисекунды, установленные в min
, являются совершенно неправильными, и это то, что использует after
(в классе Calendar
).
Как видно из вывода журнала, корень проблемы с сохраненными миллисекундами начинается с Calendar min = (GregorianCalendar) prevTime.clone()
. Есть ли другой метод копирования, который я должен использовать, чтобы обеспечить достоверные сравнения позже?
Что произойдет, если вы пропустите клон, создайте календарь и установите его значения вручную через set()? Если это работает, то проблема заключается либо в клоне(), либо в самом предшествующем. – prettyvoid
Конечно, это сводится к ошибкам пользователя ... В одном случае, когда я построил prevTime - случай, который проявился выше, я случайно использовал день месяца вместо года. Мне случалось упускать из виду этот довольно важный момент при сканировании полей «Календарь» в отладчике. – user3570982