Рассчитать разницу времени между датой и временем в Java с учетом AM / PM - PullRequest
7 голосов
/ 25 января 2012

Я хочу рассчитать разницу между двумя датой / временем в java, используя классы Date и Calendar. У меня есть формат "2012-01-24 12:30:00 PM".

Я реализовал свой собственный метод, а также Google для работы с другими, но у меня нет подсказки для обработки значений AM и PM.

Разница между датой и временем становилась проблемной, если время было 12 (AM / PM). Например, если у меня есть дата / время «2012-01-24 12:30:00 PM» и «2012-01-24 14:30:00 PM», это показывает разницу в 10 часов.

Учитывая код на этой ссылке как его можно изменить для обработки AM и PM.

Чтобы преобразовать строковую дату в дату, я использую следующий код:

    String sessionTimeStart = "2012-01-24 12:30:00 PM";
    String sessionTimerEndOrCurrent = "2012-01-24 02:30:00 PM";
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"); 

    Date d1 = null;
    Date d0 = null; 
    try {
        d1 = format.parse(sessionTimeStart);
        d0 = format.parse(sessionTimerEndOrCurrent);
    } catch (ParseException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

Ответы [ 6 ]

7 голосов
/ 25 января 2012

Проблема заключается в вашем формате даты: вместо yyyy-MM-dd HH:mm:ss a используйте yyyy-MM-dd hh:mm:ss a.

HH будет час в дне (0-23), тогда как hh будет час в AM/ PM (1-12).Таким образом, с вашим форматом даты 02:30:00 будет проанализирован как просто вместо преобразования в версию PM (которая в часе дня будет 14:30:00).

5 голосов
/ 25 января 2012

Причина, по которой он показывает 10 часов в виде разницы, заключается в том, что у вас есть ошибка в шаблоне при разборе ввода.

Вот пример использования SimpleDateFormat:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");

Date date1 = df.parse("2012-01-24 12:30:00 PM");
Date date2 = df.parse("2012-01-24 02:30:00 PM");

long differenceInHours = Math.abs(date1.getTime() - date2.getTime()) / 1000 / 60 / 60);

Вернет 10.

Когда мы слегка изменим шаблон формата даты, используя hh для часа в часах / часах (1-12) вместо HH для часа в дне (0-23):

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

Возвращает (ожидаемое) 2.

См. Документацию для SimpleDateFormat, чтобы получить правильные шаблоны.

4 голосов
/ 25 января 2012

Итак, у вас есть эти даты в виде строк?Разобрать их с SimpleDateFormat с соответствующей строкой формата и вычислить разницу в часах:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

Date d1 = df.parse("2012-01-24 12:30:00 PM");
Date d2 = df.parse("2012-01-24 02:30:00 PM");

int hoursDifference = (int)((d2.getTime() - d1.getTime()) / 3600000L);
System.out.println("Difference in hours: " + hoursDifference);

Ваша ошибка в том, что вы вместо этого используете ЧЧ (24-часовые часы) чч (12 часов) в строке формата.

1 голос
/ 25 января 2012

с использованием Apache Commons DateUtils Метод DurationFormatUtils formatPeriod сделает волшебство.

Удачи!

EDIT Предполагая, что у вас есть Дата a и Дата b, инициализированные в этот момент,

String format="HH:mm:ss.SSS";   // whatever you wish
boolean padWithZeros=true; // whatever you wish
TimeZone timezone=null; // whatever you wish
long timeA = a.getTime();
long timeB = b.getTime();

String period = DurationFormatUtils.formatPeriod(timeB, timeA, format, padWithZeros, timezone);
1 голос
/ 25 января 2012

Не создавайте его самостоятельно, используйте установленную библиотеку. Йодатим широко используется.

0 голосов
/ 25 января 2012

В календаре есть метод add (), который также можно использовать для вычитания.Посмотрите на это.В любом случае вы должны использовать Календарь вместо даты, потому что большинство операций с датой устарели.

...