Рассчитать дату / разницу во времени в Java с учетом AM/PM

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

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

разница в дате/времени возникла, когда время имеет 12(AM/PM) в нем. Например, если у меня есть дата/время "2012-01-24 12:30:00 PM" и "2012-01-24 02:30:00 часов" это показывает разницу в 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 ответов


проблема заключается в формате даты: вместо 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).


причина, по которой он показывает 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 в течение часа в am / pm (1-12) вместо HH в час дня (0-23):

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

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

посмотреть документация SimpleDateFormat чтобы получить свой паттерн.


Итак, у вас есть эти даты как строки? Проанализируйте их с помощью 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);

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


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


выход через Apache Commons DateUtils DurationFormatUtils formatPeriod метод будет делать магию.

удачи!

изменить Предполагая, что у вас есть дата 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);

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