Найти общее количество часов между двумя датами - PullRequest
39 голосов
/ 05 января 2010

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

Когда я использую .toString () в моем объекте Date, я получаю это: Пт 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);

Ответы [ 11 ]

65 голосов
/ 05 января 2010

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

long secs = (this.endDate.getTime() - this.startDate.getTime()) / 1000;
int hours = secs / 3600;    
secs = secs % 3600;
int mins = secs / 60;
secs = secs % 60;
60 голосов
/ 05 января 2010

Вот как это работает с Время Joda :

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

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

10 голосов
/ 18 декабря 2013

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

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;
}
2 голосов
/ 21 июня 2017

Пожалуйста, следуйте предложению Сомая в комментарии, вместо этого используйте Часы:

Часы часов = Часы.часы между (время начала, время окончания);

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

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

1 голос
/ 08 мая 2019

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 было введено в Java 9. Если вы используете Java 8 (или ThreeTen Backport), выполните поиск по java format duration или подобному, чтобы узнать, как форматировать продолжительность в часах и минутах.

Две цитаты с домашней страницы Joda-Time:

Теперь пользователям предлагается перейти на java.time (JSR-310).

Обратите внимание, что Joda-Time считается в значительной степени «законченным» проектом. Никаких серьезных улучшений не планируется. Если вы используете Java SE 8, пожалуйста, перенесите до java.time (JSR-310).

Ссылки

0 голосов
/ 09 мая 2019

Вот чистое решение 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();
0 голосов
/ 09 мая 2019
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 секунд. * /

0 голосов
/ 23 апреля 2019

Хотя уже есть принятый ответ, это то, что мне помогло, используя библиотеку Joda time .

/**
 *
 * @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());
}
0 голосов
/ 20 ноября 2018

для котлина, вы можете использовать функцию ниже и получать часы между двумя датами

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

0 голосов
/ 05 апреля 2016

Вот простой метод: - Проверьте 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;
    }

Надеюсь, это поможет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...