Подсчет дат на Android

Ну, в настоящее время я создаю приложение для Android, и мне нужно сохранить день и подсчитать, сколько дней до этого дня.

Я храню день в общих настройках. Сначала я инициализирую календари.

         Calendar next = Calendar.getInstance();
         Calendar now = Calendar.getInstance();

Затем я устанавливаю «следующий» календарь

            nday = prefs.getInt("d", 0);
            nmonth = prefs.getInt("m",0);
            nyear = prefs.getInt("y",0);
            next.set(nyear, nmonth, nday);

Затем я делаю это, чтобы подсчитать, сколько дней осталось.

            diff =next.getTimeInMillis()-now.getTimeInMillis();
            diffDays = diff / (24 * 60 * 60 * 1000); 
            output.setText(diffDays + " Days left");

И вот проблема. Калькулятор работал отлично до 2 дней назад. Когда он должен был сказать «3 дня», он написал «2 дня», и все равно один день идет не так. Если я пытаюсь закрыть и открыть приложение, иногда оно считает дни правильно, а иногда пропускает один день... Может кто-нибудь понять, что не так? У меня diff и diffDays такие же длинные. Я пробовал приводить их как int, но у меня все та же проблема, иногда пишет, что осталось 3 дня, иногда 2....


хорошо, я узнал, как это решить. Кажется, что getInstance имеет разницу в миллисекундах, поэтому я сделал это

Calendar now = Calendar.getInstance();
    now.set(Calendar.HOUR_OF_DAY,00); 
    now.set(Calendar.MINUTE ,00);
    now.set(Calendar.SECOND,00);
    now.set(Calendar.MILLISECOND,00);

получить день из общих настроек

       nday = extras.getInt("nDay");
       nmonth = extras.getInt("nMonth");
       nyear = extras.getInt("nYear");
       //set the calendar
       next.set(nyear, nmonth, nday, 00, 00,00);
       next.set(Calendar.MILLISECOND,00);  

и, наконец, вычислить разницу

    long diff = 0;
    diff = next.getTimeInMillis()-now.getTimeInMillis();
    diffDays = diff / (24 * 60 * 60 * 1000);
    output.setText(diffDays + " Days"); 

теперь я получаю реальную разницу без каких-либо ошибок, спасибо всем за вашу помощь!


person Alex Fragotsis    schedule 31.10.2011    source источник
comment
Когда вы создаете свои даты, очищаете ли вы их, чтобы они правильно относились к полуночи, а не к часам и минутам, которые вы их создаете?   -  person Dan S    schedule 31.10.2011
comment
я использую Calendar.getInstance() как я могу их почистить??   -  person Alex Fragotsis    schedule 01.11.2011
comment
Очистите их, установив для полей MINUTES, SECONDS и MILLISECONDS значение 0.   -  person Stephan    schedule 01.11.2011
comment
если проблема решена, вы должны принять соответствующий ответ или опубликовать свое решение, не редактируйте решенное в заголовке.   -  person oers    schedule 15.12.2011
comment
Я разместил это под своим исходным сообщением. Есть строка, а затем я пишу хорошо, я узнал, как это решить... и затем публикую свое решение. В чем проблема?   -  person Alex Fragotsis    schedule 16.12.2011


Ответы (2)


Поскольку он неявно приводит к длинному, поэтому вы теряете часть своих минут и часов.

Объявите diffDays как двойное, тогда вы сможете показать пользователю, когда они есть, например 2.5 days, и он не покажет его как 2 days. Или вы можете взять целую часть дней и рассчитать час из дроби:

int hour = (diffDays - Math.floor(diffDays))*24

Это дает вам минуту. Просто убедитесь, что вы объявили diffDays как double или float.

person Jong    schedule 31.10.2011
comment
Я попробовал, но теперь он пишет 1,0 дня и все еще неправильно, иногда, когда я закрываю и открываю его, он пишет 2,0 дня.. Как это может произойти? Иногда он вычисляет 2 дня, а иногда 3... может быть, если я объявлю даты следующим образом -> 2-11-2011 00:00 сейчас -> 31-10-2011 00:00, может быть, тогда я смогу получить правильную разницу - person Alex Fragotsis; 31.10.2011
comment
Но если вы объявите их таким образом, вы потеряете часы... Если вы не заботитесь о них, вы можете это сделать. - person Jong; 31.10.2011
comment
да, мне не нужны часы, я просто хочу разницу в днях между двумя датами. - person Alex Fragotsis; 01.11.2011
comment
Так что вы можете сделать то, что вы предложили в своем первом комментарии. - person Jong; 01.11.2011

Также используйте календарь для расчета дат.

Calendar diff = Calendar.getInstance();
long diffMillis = next.getTimeInMillis()-now.getTimeInMillis();
diff.setTimeInMilliSeconds(Math.abs(diffMillis));
int days = diff.get(Calendar.DAY_OF_YEAR);

if (diffMillis < 0L) {
  days *= -1;
}
person Stephan    schedule 31.10.2011
comment
это хорошая идея, но я не могу ее использовать, потому что, если пройдет следующий день, я хочу показать -1, -2 и т. д. Если я попробую по-вашему вместо -1, он покажет 365. Хорошая идея, хотя - person Alex Fragotsis; 01.11.2011
comment
Вы можете решить эту проблему, используя абсолютное значение миллисекунд и подписать его после вычисления. Я обновил код. - person Stephan; 01.11.2011