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

cla*_*234 40 java

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

当我在我的Date对象上使用.toString()时,我得到了这个:Fri Dec 18 08:08:10 CST 2009

我尝试过以下方法:

long diff=(this.endDate.getTime()-this.startDate.getTime())/(60*60 * 1000);
Run Code Online (Sandbox Code Playgroud)

但这只给我几小时,而不是分钟.我知道这是一个简单的问题,但我无法理解它.

编辑:感兴趣的人的最终解决方案.感谢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);
Run Code Online (Sandbox Code Playgroud)

Rob*_*Dam 69

这应该工作.

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


Mic*_*vis 62

以下是Joda时间的工作原理:

DateTime startTime, endTime;
Period p = new Period(startTime, endTime);
int hours = p.getHours();
int minutes = p.getMinutes();
Run Code Online (Sandbox Code Playgroud)

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

  • 奇怪的时期不适合我.即使日期相隔几天,我的所有时间也只有0.相反,我使用了这个:小时小时= Hours.hoursBetween(startTime,endTime); 我幸运地只需要一小时,所以这对我有用. (13认同)
  • 这只能起作用,因为 - 正如OP指出的那样 - 开始/结束恰好是同一天.正如其他评论者所指出的那样,在使用不同日期时它会失败.Joda Period分为多个字段,getXXX方法只返回特定字段的值(例如,2天,2小时30分钟,getHours将返回2,而不是50(2*24 + 2)根据Somaiah的评论,使用Joda"找到两个日期之间的总小时数"的正确方法. (8认同)

小智 11

这是一个简单的方法:

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;
}
Run Code Online (Sandbox Code Playgroud)


Ole*_*.V. 5

java.time.Duration

我想贡献现代(java 8+)答案。使用 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);
Run Code Online (Sandbox Code Playgroud)

如果startDateendDate两者都具有类型InstantorOffsetDateTimeZonedDateTimeor LocalDateTimeor ,则此方法有效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)。

链接