2010-01-05 11 views
35

У меня есть два объекта Date, и мне нужно получить разницу во времени, чтобы определить общие часы между ними. Они случаются с того же дня. В результате я бы хотел, чтобы часы и минуты.Найдите общее количество часов между двумя датами

Когда я использую .ToString() на дату моего объекта я получаю это: Пт 18 декабря 8:08:10 CST 2009

Я попытался следующие:

long diff=(this.endDate.getTime()-this.startDate.getTime())/(60*60 * 1000); 

Но это только дает мне часы, а не минуты. Я знаю, что это простая проблема, но я не могу понять это.

Редакции: Окончательное решение для заинтересованных. Спасибо Michael Brewer-Davis

Period p = new Period(this.startDate, this.endDate); 
long hours = p.getHours(); 
long minutes = p.getMinutes(); 

String format = String.format("%%0%dd", 2); 

return Long.toString(hours)+":"+String.format(format, minutes); 
+0

Обновите свой ответ @ clang1234. Это очень вводит в заблуждение и может легко вводить ошибки. Этот код работает только в том случае, если 'startDate' и' endDate' находятся в тот же день. вам нужно сделать что-то вроде 'Hours.hoursBetween (startTime, endTime) .getHours()', как указано в комментариях. – Arjit

ответ

57

Вот как он работает с Joda time:

DateTime startTime, endTime; 
Period p = new Period(startTime, endTime); 
int hours = p.getHours(); 
int minutes = p.getMinutes(); 

Вы можете форматировать с форматтеров Joda в, например, PeriodFormat, но я предлагаю использовать в Java. См. this question для получения более подробной информации.

+1

Это идеальный вариант. Спасибо за ссылку Joda Time. Но как мне получить дисплей «H: mm», где H - часы и минуты. Например, «1:05». На данный момент будет отображаться «1: 5» – clang1234

+0

Добавлена ​​ссылка для форматирования. –

+1

Замечательный. Спасибо за помощь – clang1234

0

Таким образом, метод getTime(), как я полагаю, возвращает целое число.

В этом случае левый набор круглых скобок имеет тип int, правильно?

и

(60*60*1000) 

также внутр.

Это означает, что вы получаете long diff = ((int)/(int)), поэтому целочисленное деление выполняется до того, как вы произведете материал дольше. И, следовательно, вы теряете свои минуты.

Попробуйте бросить их перед тем, как вы разделите.

+0

Метод getTime() возвращает Long, а не int. – clang1234

+0

А ... Тогда, по-моему, Роб ван Дам сказал. Также, что Грегс сказал. –

60

Это должно сработать.

long secs = (this.endDate.getTime() - this.startDate.getTime())/1000; 
int hours = secs/3600;  
secs = secs % 3600; 
int mins = secs/60; 
secs = secs % 60; 
+3

Мне нравится это решение, потому что для этого требуется только чистая Java. для меня этого достаточно. – Gondy

8

Вот простой способ:

private static int hoursDifference(Date date1, Date date2) { 

    final int MILLI_TO_HOUR = 1000 * 60 * 60; 
    return (int) (date1.getTime() - date2.getTime())/MILLI_TO_HOUR; 
} 
+0

Использование DateTimeConstants.MILLIS_PER_HOUR, если использовать время Joda – Troveldom

-1

Вот простой метод: - Проверьте Date format, если дата не в этом формате, то изменить его и передать этому методу даст вам String что является вашим результатом. Измените метод согласно требованию.

private String getDateAsTime(String datePrev) { 
     String daysAsTime = ""; 
     long day = 0, diff = 0; 
     String outputPattern = "yyyy:MM:dd HH:mm:ss"; 
     SimpleDateFormat outputFormat = new SimpleDateFormat(outputPattern); 
     Calendar c = Calendar.getInstance(); 
     String dateCurrent = outputFormat.format(c.getTime()); 
     try { 
      Date date1 = outputFormat.parse(datePrev); 
      Date date2 = outputFormat.parse(dateCurrent); 
      diff = date2.getTime() - date1.getTime(); 
      day = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     if (day == 0) { 
      long hour = TimeUnit.HOURS.convert(diff, TimeUnit.MILLISECONDS); 
      if (hour == 0) 
       daysAsTime = String.valueOf(TimeUnit.MINUTES.convert(diff, TimeUnit.MILLISECONDS)).concat(" minutes ago"); 
      else 
       daysAsTime = String.valueOf(hour).concat(" hours ago"); 
     } else { 
      daysAsTime = String.valueOf(day).concat(" days ago"); 
     } 
     return daysAsTime; 
    } 

Надеется, что это поможет,

1

Пожалуйста, следуйте предложению Somaiah в комментариях, используйте вместо часов:

Часы работа = Hours.hoursBetween (STARTTIME, EndTime);

Звонок на getHours() будет возвращать только часовой раздел разницы во времени и игнорировать разницу в течение всего года и месяца, поэтому в некоторых случаях это было бы неправильно.

Если вы используете Period.toStandardHours(), чтобы попытаться преобразовать разницу во времени в часы, расчет будет вызывать исключение, если разница во времени между двумя датами включает разницу в любом году или месяце, поскольку длина месяца неизвестна ,

Смежные вопросы