Подсчет дат на Android - PullRequest
       24

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

0 голосов
/ 31 октября 2011

Ну, я сейчас создаю приложение для 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"); 

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

Ответы [ 2 ]

0 голосов
/ 31 октября 2011

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

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

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

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

0 голосов
/ 31 октября 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;
}
...