Таймер обратного отсчета не показывает количество оставшихся дней

Я пишу программу, в которой использую обратный отсчет до определенной даты и времени, и в результате получаю обратный отсчет в формате часов, минут, секунд , но я также хочу показать количество дней

получаю это:

       Time remaining: 630 hours, 57 minutes, 25 seconds

нужно это:

       Time remaining: 26 days, 11 hours, 57 minutes, 25 seconds

Код активности: -

    public void onTick(long millisUntilFinished) {
                String result = ToReadableString(new org.joda.time.Period(millisUntilFinished));                   
                countdown.setText("Time remaining: " + result);
            }

    private String ToReadableString(Period period) {

        int days = period.get(DurationFieldType.days());

        int hours = period.get(DurationFieldType.hours());
        int minutes = period.getMinutes();
        int seconds = period.getSeconds();

        StringBuilder sb = new StringBuilder();

        if (days > 0) {
            sb.append(days);
            if (days == 1) {
                sb.append(" day, ");
            } else {
                sb.append(" days, ");
            }
        }

        if (hours > 0) {
            sb.append(hours);
            if (hours == 1) {
                sb.append(" hour, ");
            } else {
                sb.append(" hours, ");
            }
        }

        if (minutes > 0) {
            sb.append(minutes);
            if (minutes == 1) {
                sb.append(" minute, ");
            } else {
                sb.append(" minutes, ");
            }
        }

        if (seconds > 0) {
            sb.append(seconds);
            if (seconds == 1) {
                sb.append(" second, ");
            } else {
                sb.append(" seconds, ");
            }
        }

        String result = sb.toString().trim();

        if (result.endsWith(","))
            result = result.substring(0, result.length() - 1);

        return result;
    }
}

person Sun    schedule 01.08.2014    source источник
comment
В вашей функции ToReadableString вы получаете часы - не можете ли вы сами преобразовать их в дни и использовать остаток для расчета часов?   -  person gavlaaaaaaaa    schedule 01.08.2014


Ответы (4)


В вашей функции ToReadableString просто сделайте следующее, чтобы получить количество дней из часов - вам также придется учесть другие различия:

int days = hours/24;
hours = hours % 24;


//rest of conversion code
person gavlaaaaaaaa    schedule 01.08.2014
comment
Я думаю, вы ошиблись с часами, зачем вам умножать их на 24? - person Su-Au Hwang; 03.08.2014
comment
Например. 73 часа в известных нам днях - это 3 дня и один час. Итак, 73/24 = 3,04166667, что дает нам 3 дня. Затем вы умножаете остаток на 24. Итак, 0,04166667 * 24 = 1. Надеюсь, что это проясняет это. - person gavlaaaaaaaa; 03.08.2014
comment
73% 24 = 1, умножать на 24 не нужно - person Su-Au Hwang; 04.08.2014
comment
Кстати, я использовал эти строки: int days = hours / 24; часы = часы% 24; и получение лучших результатов - person Sun; 04.08.2014
comment
Отредактировано на основе отзывов - person gavlaaaaaaaa; 04.08.2014

РЕДАКТИРОВАТЬ:

Я редактирую это, чтобы подчеркнуть, почему позволить Джодатим выполнять тяжелую работу может быть лучшим выбором. Вы можете полностью удалить ToReadableString, все, что вам нужно, это (я вытащил некоторые переменные в константы, это не обязательно):

private static final PeriodType PERIOD_TYPE = PeriodType.dayTime().withMillisRemoved();
private static final PeriodFormatter PERIOD_FORMATTER = PeriodFormat.getDefault();

public void onTick(long millisUntilFinished) {
    Period period = new Period(millisUntilFinished, PERIOD_TYPE);
    countdown.setText("Time remaining: " + PERIOD_FORMATTER.print(period));
}

Сверху можно получить все вкусности Джодатима с минимальными усилиями. Меньше кода, меньше ошибок.

РЕДАКТИРОВАТЬ КОНЕЦ;

Конструктор public Period(long duration) Joda time использует стандартный набор полей и, следовательно, не включает годы / дни и т. Д., Вам следует использовать альтернативный конструктор public Period(long duration, PeriodType type)

для вашего примера замените:

String result = ToReadableString(new org.joda.time.Period(millisUntilFinished));

с участием:

String result = ToReadableString(new org.joda.time.Period(millisUntilFinished, org.joda.time.PeriodType.dayTime().withMillisRemoved()));

Кстати, Jodatime может избавить от боли преобразование точки в строку. Используйте для этого PeriodFormatter. например.:

String yourOutputString = PeriodFormat.getDefault().print(period);

вы можете исправить свой импорт для удобства чтения.

Fyr: Joda time Javadoc

person Su-Au Hwang    schedule 01.08.2014

Вы можете рассчитать вручную. Я вставляю ниже метод расчета дневных часов мин и секунды из разницы в миллисекундах.

public static String getDateHourMinSecond(long diffMillis) {

    long days = TimeUnit.MILLISECONDS.toDays(diffMillis);
    diffMillis -= TimeUnit.DAYS.toMillis(days);
    long hours = TimeUnit.MILLISECONDS.toHours(diffMillis);
    diffMillis -= TimeUnit.HOURS.toMillis(hours);
    long minutes = TimeUnit.MILLISECONDS.toMinutes(diffMillis);
    diffMillis -= TimeUnit.MINUTES.toMillis(minutes);
    long seconds = TimeUnit.MILLISECONDS.toSeconds(diffMillis);
    String dhms = days + " : " + hours + " : " + minutes + " : " + seconds;
    return dhms;
}
person Divyang Metaliya    schedule 01.08.2014

Попробуйте эту функцию

public void clockCounter(Date startTime) {
Date currentDate =null;
SimpleDateFormat dateFormat = new SimpleDateFormat(
                    "yyyy-MM-dd HH:mm:ss");

            Calendar cal = Calendar.getInstance();
            currentDate = dateFormat.parse(dateFormat.format(cal.getTime()));

        long diffInSec = startTime.getTime() - currentDate.getTime();

        long seconds = diffInSec % 60;
        diffInSec /= 60;
        long minutes = diffInSec % 60;
        diffInSec /= 60;
        long hours = diffInSec % 24;
        diffInSec /= 24;
        long days = diffInSec;

        Log.i("Difference", days+":"+hours+":"+minutes+":"+seconds);
    }
person Zeeshan Saiyed    schedule 01.08.2014