Найдите общее количество часов между двумя датами
У меня есть два объекта Date, и мне нужно получить разницу во времени, чтобы определить общие часы между ними. Они случаются с того же дня. В результате я бы хотел, чтобы часы и минуты.
Когда я использую .toString() в моем объекте Date, я получаю это: Fri Dec 18 08:08:10 CST 2009
Я пробовал следующее:
long diff=(this.endDate.getTime()-this.startDate.getTime())/(60*60 * 1000);
Но это только дает мне часы, а не минуты.
Я знаю, что это простая проблема, но я не могу понять это.
редактирует:
Окончательное решение для заинтересованных. Благодаря Майклу Брюер-Дэвису
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);
Ответы
Ответ 1
Здесь, как это работает с Joda time:
DateTime startTime, endTime;
Period p = new Period(startTime, endTime);
int hours = p.getHours();
int minutes = p.getMinutes();
Вы можете форматировать форматировщики Joda, например, PeriodFormat, но я бы предложил использовать Java. Подробнее см. этот вопрос.
Ответ 2
Это должно работать.
long secs = (this.endDate.getTime() - this.startDate.getTime()) / 1000;
int hours = secs / 3600;
secs = secs % 3600;
int mins = secs / 60;
secs = secs % 60;
Ответ 3
Вот простой способ:
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;
}
Ответ 4
Пожалуйста, следуйте предложению Somaiah в комментарии, используйте Часы вместо:
Часы часов = Hours.hoursBetween(startTime, endTime);
Призыв getHours() будет возвращать только часовой раздел разницы во времени и игнорировать разницу в течение всего года, месяца, поэтому в некоторых случаях это будет неверно.
Если вы используете Period.toStandardHours(), чтобы попытаться преобразовать разницу во времени в часы, расчет будет генерировать исключение, если разница во времени между двумя датами включает разницу в любом году или месяце, так как длина месяца неизвестна.
Ответ 5
java.time.Duration
Я хотел бы внести современный ответ. Решения, использующие Joda-Time, хороши. Проект Joda-Time находится в режиме обслуживания, поэтому для нового кода мы не должны его использовать. Я следую официальной рекомендации проекта Joda-Time и использую java.time, современный Java-интерфейс даты и времени:
Duration dur = Duration.between(startDate, endDate);
String result = String.format("%d:%02d", dur.toHours(), dur.toMinutesPart());
System.out.println(result);
Это работает, если startDate
и endDate
имеют тип Instant
или OffsetDateTime
или ZonedDateTime
или LocalDateTime
или LocalTime
. Все упомянутые типы взяты из пакета java.time
. Если вы начинаете с LocalDate
, вызовите любой из методов atStartOfDay
.
toMinutesPart
toMinutesPart был представлен в Java 9. Если вы используете Java 8 (или ThreeTen Backport), выполните поиск по java format duration
или аналогичном, чтобы узнать, как форматировать продолжительность в часах и минутах.
Две цитаты с домашней страницы Joda-Time:
Теперь пользователям предлагается перейти на java.time
(JSR-310).
Обратите внимание, что Joda-Time считается в значительной степени "законченным" проектом. Никаких серьезных улучшений не планируется. Если используется Java SE 8, перейдите на java.time
(JSR-310).
связи
Ответ 6
Поэтому метод getTime(), как я полагаю, возвращает целое число.
В этом случае левое множество круглых скобок имеет тип int, right?
и
(60*60*1000)
также является int.
Это означает, что вы получаете long diff = ((int)/(int)), поэтому целочисленное деление выполняется до того, как вы добавите материал в длинный. И, следовательно, вы теряете свои минуты.
Попробуйте использовать их перед делением.
Ответ 7
для kotlin, вы можете использовать функцию ниже и получить часы между двумя датами
private val dateFormat: String = "yyyy-MM-dd @ hh:mm a"
val startDate = SimpleDateFormat(dateFormat).parse("2018-10-01 @ 12:33 PM")
val endDate = SimpleDateFormat(dateFormat).parse("2018-10-01 @ 02:46 PM")
private fun hoursDifference(date1: Date, date2: Date): Int {
val milliToHour : Long = 1000 * 60 * 60
return ((date1.time - date2.time) / milliToHour).toInt()
}
println(hoursDifference(endDate,startDate).toString())
Выход: 2
Ответ 8
Вот мой код
public static String calculateTimeBetweenDates(Instant lastLogin, Instant currentInstance, Messages messages) {
long timeSeconds = Duration.between(lastLogin, currentInstance).getSeconds();
final long days = timeSeconds / 86400; // 24*60*60
final long hours = timeSeconds / 3600;
final long minutes = (timeSeconds % 3600) / 60;
final long seconds = (timeSeconds % 3600) % 60;
if (days > 29) {
return String.valueOf(LocalDateTime.ofInstant(lastLogin, ZoneId.systemDefault()).toLocalDate());
}
if (days >= 21) {
return ("3 ".concat(messages.labelWeeks()));
}
if (days >= 14) {
return ("2 ".concat(messages.labelWeeks()));
}
if (days != 0) {
if (days < 2) {
return Long.toString(days).concat(" ".concat(messages.labelDay()));
}
return Long.toString(days).concat(" ".concat(messages.labelDays()));
}
if (hours != 0) {
if (hours < 2) {
return Long.toString(hours).concat(" ".concat(messages.labelHour()));
}
return Long.toString(hours).concat(" ".concat(messages.labelHours()));
}
if (minutes != 0) {
if (minutes < 2) {
return Long.toString(minutes).concat(" ".concat(messages.labelMinute()));
}
return Long.toString(minutes).concat(" ".concat(messages.labelMinutes()));
}
if (seconds != 0) {
return Long.toString(seconds).concat(" ".concat(messages.labelSeconds()));
}
return null;
}
Ответ 9
Хотя там уже принят ответ, это то, что мне помогло, используя библиотеку времени Joda.
/**
*
* @param date1
* @param date2
* @return hours between two dates rounded down
*/
public static int hoursBetween(DateTime date1, DateTime date2) {
if(date1 == null || date2 == null) return NOT_FOUND;
return Math.abs(Hours.hoursBetween(date1.toLocalDateTime(), date2.toLocalDateTime()).getHours());
}
Ответ 10
private void getHours(Date d1, Date d2){
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffDays = diff / (24 * 60 * 60 * 1000);
long diffHours = diff / (60 * 60 * 1000) % 24;
System.out.print(diffDays + " days, ");
System.out.print(diffHours + " hours, ");
System.out.print(diffMinutes + " minutes, ");
System.out.print(diffSeconds + " seconds.\n");
}"
//Отображается:/* 1 день, 1 час, 1 минута, 50 секунд. */
Ответ 11
Здесь чисто Java 8+ решение, которое не включает Joda или математические операции
import java.time.*;
import java.time.temporal.*;
// given two java.util.Dates
Date startDate ...
Date endDate ...
// convert them to ZonedDateTime instances
ZonedDateTime start = ZonedDateTime.ofInstant(startDate.toInstant(), ZoneId.systemDefault());
ZonedDateTime end = ZonedDateTime.ofInstant(endDate.toInstant(), ZoneId.systemDefault());
// get the total duration of minutes between them
Duration total = Duration.ofMinutes(ChronoUnit.MINUTES.between(start, end));
// use the duration to determine the hours and minutes values
long hours = total.toHours();
long minutes = total.minusHours(hours).toMinutes();
Ответ 12
Вот простой способ: -
Проверьте 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;
}
Надеюсь, это поможет,