Разница в минутах, между двумя датами
Мне нужно получить количество минут между двумя датами. Я знаю, что 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));
}
Ответы
Ответ 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.