2014-10-24 2 views
0

Не похоже, что этот вопрос возник до этого, поэтому я попрошу его здесь: Ожидается ли «мелкое» копирование Календаря через 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 показан ниже:

  1. Предлагаемое время = 1414247640000, мин время = -61180824420000
  2. Предлагаемое время = 1414247640000, мин Время = -61180822620000

После просмотра полей min в отладчике, я вижу, что add правильно устанавливает час 11 минут до 03, и дата 2014- 10-25, так что кажется, что add работает правильно. Однако, когда сравнение выполняется, миллисекунды, установленные в min, являются совершенно неправильными, и это то, что использует after (в классе Calendar).

Как видно из вывода журнала, корень проблемы с сохраненными миллисекундами начинается с Calendar min = (GregorianCalendar) prevTime.clone(). Есть ли другой метод копирования, который я должен использовать, чтобы обеспечить достоверные сравнения позже?

+0

Что произойдет, если вы пропустите клон, создайте календарь и установите его значения вручную через set()? Если это работает, то проблема заключается либо в клоне(), либо в самом предшествующем. – prettyvoid

+0

Конечно, это сводится к ошибкам пользователя ... В одном случае, когда я построил prevTime - случай, который проявился выше, я случайно использовал день месяца вместо года. Мне случалось упускать из виду этот довольно важный момент при сканировании полей «Календарь» в отладчике. – user3570982

ответ

0

Проблема была неправильной инициализацией prevTime, как это было предложено prettyvoid.

0

Попробуйте добавить min.getTime() непосредственно перед предложением.после (мин) и посмотреть, как оно работает;) .. Я оставлю его вам, чтобы прочитать исходный код и выяснить, почему.

Смежные вопросы