2017-01-05 2 views
0

Я наткнулся на этот метод, который форматирует время до тех пор, пока будильник не погаснет. Иногда, например, когда я устанавливаю время до 13:46, и мое мобильное время составляет 13:44, я получаю текст, что осталось 1 минута до моего будильника, что, очевидно, является ложной информацией. Вот код, который делает материал:Правильное форматирование времени в Java

private static String formatAlarmTime(Context c) { 
    if (!App.getState().alarm().on()) { 
     return ""; 
    } 
    long t = App.getState().alarm().nextAlarm().getTimeInMillis() - System.currentTimeMillis() - 1; 
    t = t/60/1000; 
    int m = (int) (t % 60); 
    int h = (int) (t/60); 

    String minSeq = (m == 0) ? "" : 
      (m == 1) ? c.getString(R.string.minute) : 
        c.getString(R.string.minutes, Long.toString(m)); 

    String hourSeq = (h == 0) ? "" : 
      (h == 1) ? c.getString(R.string.hour) : 
        c.getString(R.string.hours, Long.toString(h)); 

    int index = ((h > 0) ? 1 : 0) | ((m > 0) ? 2 : 0); 

    String[] formats = c.getResources().getStringArray(R.array.alarm_set); 
    return String.format(formats[index], hourSeq, minSeq); 
} 

Массив упоминается как это:

<string-array name="alarm_set"> 
    <item>This alarm is set for less than 1 minute from now</item> 
    <item>This alarm is set for %1$s from now</item> 
    <item>This alarm is set for %2$s from now</item> 
    <item>This alarm is set for %1$s and %2$s from now</item> 
</string-array> 

Кстати, если кто был заинтересован, этот код приходит от this site

Любые идеи?

ответ

0

Код округляется до четного количества минут, поэтому он сообщает 1 минуту, если разница составляет от 1 до 2 минут, а именно, когда время в мобильном устройстве составляет 13:44: и будильник установлен на 13 : 46: 00.

Чтобы округлить вверх, а не вниз:

int ms = (int) (t % (60 * 1000)); 
t = t/60/1000; 
if (ms > 0) { 
    // Round up! 
    t++; 
} 
int m = (int) (t % 60); 
int h = (int) (t/60); 
+0

О, спасибо. К сожалению, я не знаю, как это исправить. У вас есть какие-нибудь рекомендации ? – Traabefi

+0

@Traabefi Я даже не уверен, что он сломан. Но я думаю, вы бы предпочли округлить число минут? –

0

Как состояний @KlasLindback в своем ответе вы проблема в том, чтобы сделать с вашими значениями округляется во время расчета. Это связано с тем, что используемый тип данных int поддерживает значения Integer - целые числа. В ситуациях, когда вы передаете десятичные значения в тип данных int, он усекает (удаляет) десятичную часть.

Вместо этого во время расчета вы должны убедиться, что используете тип данных, который поддерживает десятичные значения, например double.

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

double hours = TimeUnit.MILLISECONDS.toHours(t); 
double mins = TimeUnit.MILLISECONDS.toMinutes(t); 
double secs = TimeUnit.MILLISECONDS.toSeconds(t); 

Если вы создаете логику этих десятичных значений вы должны быть в состоянии для достижения того, что вы хотите с точки зрения выбора правильного значения массива.