Вы ожидали увидеть что-то подобное:
seconds = 36 (always less than 60)
minutes = 12 (always less that 60)
hours = 17 (always less than 24)
days = 45 (always less that 31 if # of months is used, else < 366 if # of years is used)
...
...
от:
// CONVERT:
int seconds = (int) TimeUnit.MILLISECONDS.toSeconds(diff);
int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(diff);
int hours = (int) TimeUnit.MILLISECONDS.toHours(diff);
int days = (int) TimeUnit.MILLISECONDS.toDays(diff);
Ее логическим эр Тогда. TimeUnit.MILLISECONDS.toXXXX(long)
преобразует целиком разницу во времени в указанные единицы. Это не имеет никакого значения для вас.
В качестве примера предположим, что вы установили дату события 32 days from now
- и время до 13:15
.
разница миллисекунды =
2764800000 (32 days in millis)
+ 46800000 (13 hours in millis)
+ 900000 (15 minutes in millis)
= 2812500000
Используя эту временную разницу, следующий журнал:
int seconds = (int) TimeUnit.MILLISECONDS.toSeconds(diff);
int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(diff);
int hours = (int) TimeUnit.MILLISECONDS.toHours(diff);
int days = (int) TimeUnit.MILLISECONDS.toDays(diff);
производит:
Seconds left: 2812500
Minutes left: 46875
Hours left: 781
Days left: 32
Эти цифры не прочь. Быстрая проверка будет: разница во времени в миллисе была: 2812500000 => в секундах будет diff/1000 = 2812500 => в минутах будет => diff/1000/60 = 46875 и так далее.
Относительное время:
Чтобы получить относительное время, такие как 32 days, 13 hours and 15 minutes left
, вам придется сделать большой подъем самостоятельно. В качестве примера:
// I will use the actual values instead of defined
// variables to make this easier to follow
long timeDiff = 2812500000L;
// Simple division // we don't care about the remainder
// Result: 32
int days = 2812500000/DateUtils.DAY_IN_MILLIS;
// This is what's left over after we take the days out.
// We'll use this to get the number of hours.
// Result: 47700000
long remainderFromDays = 2812500000 % DateUtils.DAY_IN_MILLIS;
// Simple division // we don't care about the remainder
// Result: 13
int hours = 47700000/DateUtils.HOUR_IN_MILLIS;
// This is what's left over after we take the hours out.
// We'll use this to get the number of minutes.
// Result: 900000
long remainderFromHours = 47700000 % DateUtils.HOUR_IN_MILLIS;
// Result: 15
int minutes = 900000/DateUtils.MINUTE_IN_MILLIS;
// Result: 0
long remainderFromMinutes = 900000 % DateUtils.MINUTE_IN_MILLIS;
// Result: 0
int seconds = 0/1000; // 1000 ms = 1 sec
Log.i("Time-Difference", "Event in: " + String.format("Event in %d days, %d hours, %d minutes and %d seconds", days, hours, minutes, seconds));
Выход:
Event in: 32 days, 13 hours, 15 minutes and 0 seconds
Это причина того, что все здесь предлагает, Joda времени. Вышеприведенное вычисление находится совсем близко от моей головы. Я не могу гарантировать его правильность. Если вам также нужна относительная разница в месяце (например, 3 months, 2 days ....
), потребуется много работы. Существует не DateUtils.MONTH_IN_MILLIS
константа - меняющееся количество дней - 28, 29, 30, 31.
С другой стороны, Joda Time является проверенным продуктом &. Но если все, что вам нужно, это один из видов вычислений, которые используются редко (если вообще когда-либо), я бы сказал, потратьте немного времени и придумайте собственную реализацию, а не используете Joda Time.
Вы можете показать данные своего журнала? неправильные данные отображаются в последней строке? "int days = ~"? – sique
Дни обычно около 30-32. – TastyLemons
Проблема с кодом может заключаться в том, что событие прошло и diff отрицательный. Попробуйте 'diff = Math.abs (diff)'. – kichik