Рассчитать дату / разницу во времени в 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 (), который также может использоваться для подстроки. Взгляните на него. В любом случае вы должны использовать календарь вместо даты, потому что большинство операций с датой устарели.