Разница в минутах между двумя датами - PullRequest
18 голосов
/ 21 ноября 2011

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

Однако код, который я использую, похоже, не работает. Я пытаюсь получить количество минут между «21.11.2011 7:00:00» и «21.11.2011 1:00:00» (которое должно быть 360 минут), но код, который я использую возвраты 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));
}

Ответы [ 2 ]

15 голосов
/ 21 ноября 2011

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

Также, на практике, я бы изменил:

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

до:

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

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

5 голосов
/ 21 ноября 2011

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

Неразборчивая дата: 21.11.2011, 07:00:00

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

чч = 1-12
КК = 0-11
ЧЧ = 0-23
кк = 1-24

Измените SimpleDateFormat строку на эту:

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


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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...