Подтвердить что ты не робот

Разница в минутах, между двумя датами

Мне нужно получить количество минут между двумя датами. Я знаю, что Joda лучше всего использовать, но это для Android-проекта, поэтому я предпочитаю использовать как можно меньше внешних библиотек, а приложение, которое я создаю, не требует, чтобы расчет был точным с хирургическим контролем.

Однако код, который я использую, кажется, не работает. Я пытаюсь получить количество минут между "11/21/2011 7:00:00 AM" и "11/21/2011 1:00:00 PM" (это должно быть 360 минут), но код я 'm using возвращает 0:

int diff = minutesDiff(GetItemDate("11/21/2011 7:00:00 AM"), GetItemDate("11/21/2011 1:00:00 PM"));

public static Date GetItemDate(final String date)
{
    final Calendar cal = Calendar.getInstance(TimeZone.getDefault());
    final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss a");
    format.setCalendar(cal);

    try {
        return format.parse(date);
    } catch (ParseException e) {
        return null;
    }
}

public static int minutesDiff(Date earlierDate, Date laterDate)
{
    if( earlierDate == null || laterDate == null ) return 0;

    return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000));
}
4b9b3361

Ответ 1

Я отлаживал ваш код: есть ParseException в GetItemDate() для обеих строк даты, например:

Непревзойденная дата: 11/21/2011 07:00:00 AM

Проблема заключается в том, что синтаксический анализ часов AM/PM работает только с "hh" (небольшие кепки!) или "KK". По крайней мере, это имеет место в моем телефоне (кажется, некоторые из нас вообще этого не видели). Я тестировал его также работает с одним "h" тоже.

hh = 1-12
KK = 0-11
HH = 0-23
kk = 1-24

Измените строку SimpleDateFormat следующим образом:

final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", Locale.US);


В этом сообщении объясняются "a" и Locale: Невозможно проанализировать строку DateTime с маркером AM/PM

PS. Я из Финляндии, поэтому для этого я должен использовать часть "Locale.US". Я думаю, что жители США могут проверить код без него.

Ответ 2

Если ваш GetItemDate не подходит для любой даты, вы получите нуль. В инструкции catch поставьте println или debug, чтобы вывести проблему и посмотреть, что это говорит вам.

Кроме того, как раз на практике, я бы изменил:

return (int)((laterDate.getTime()/60000) - (earlierDate.getTime()/60000));

в

long result = ((laterDate.getTime()/60000) - (earlierDate.getTime()/60000));
return (int) result;

Это дает вам возможность просмотреть результат математики в среде IDE.