Подтвердить что ты не робот

Найдите общее количество часов между двумя датами

У меня есть два объекта 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);
4b9b3361

Ответ 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;
    }

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