查找两个日期之间的总小时数

时间:2010-01-05 01:15:41

标签: java

我有两个Date对象,我需要得到时间差,这样我就可以确定它们之间的总小时数。他们碰巧是在同一天。我想要的结果是小时和分钟。

当我在我的Date对象上使用.toString()时,我得到了这个:Fri Dec 18 08: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);

11 个答案:

答案 0 :(得分:64)

这应该有用。

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

答案 1 :(得分:60)

以下是Joda time

的工作原理
DateTime startTime, endTime;
Period p = new Period(startTime, endTime);
int hours = p.getHours();
int minutes = p.getMinutes();

您可以使用Joda的格式化程序格式化,例如PeriodFormat,但我建议使用Java。有关详细信息,请参阅this question

答案 2 :(得分:10)

这是一个简单的方法:

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;
}

答案 3 :(得分:2)

请在评论中遵循Somaiah的建议,改为使用小时:

  

小时小时= Hours.hoursBetween(startTime,endTime);

对getHours()的调用只返回时差的小时部分,并忽略所有年,月差异,因此在某些情况下不正确。

如果您使用Period.toStandardHours()尝试将时差转换为小时,如果两个日期之间的时差包括年或月的差异,则计算将引发异常,因为月长未知。

答案 4 :(得分:1)

java.time.Duration

我想贡献现代的答案。使用Joda-Time的解决方案很好。 Joda-Time项目处于维护模式,因此对于新代码,我们不应使用它。我遵循Joda-Time项目的官方建议,并使用java.time(现代Java日期和时间API):

    Duration dur = Duration.between(startDate, endDate);
    String result = String.format("%d:%02d", dur.toHours(), dur.toMinutesPart());
    System.out.println(result);

如果startDateendDate都具有类型InstantOffsetDateTimeZonedDateTimeLocalDateTimeLocalTime,则此方法有效。所有提到的类型均来自java.time包。如果以LocalDate开头,请调用atStartOfDay方法之一。

toMinutesPart是在Java 9中引入的。如果您正在使用Java 8(otTenTen Backport),请搜索java format duration或类似内容以学习如何将持续时间格式化为小时和分钟。 / p>

Joda-Time主页上的两句话:

  

现在要求用户迁移到java.time(JSR-310)。

     

请注意,Joda-Time被认为是很大程度上“完成”的项目。   没有计划进行重大增强。如果使用Java SE 8,请迁移   到java.time(JSR-310)。

链接

答案 5 :(得分:0)

因此,我假设getTime()方法返回一个整数。

在这种情况下,左括号组的类型为int,right?

(60*60*1000)

也是一个int。

这意味着你得到很长的diff =((int)/(int))所以整数除法是在你把东西转换为long之前完成的。因此你会失去你的会议记录。

在你分手之前尝试施放它们。

答案 6 :(得分:0)

对于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

答案 7 :(得分:0)

即使已经有一个公认的答案,这也是使用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());
}

答案 8 :(得分:0)

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秒。 * /

答案 9 :(得分:0)

这是不涉及Joda或数学运算的纯Java 8+解决方案

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();

答案 10 :(得分:-2)

这是一个简单的方法: - 检查您的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;
    }

希望这会有所帮助,