Java 如何将两个日期的差异转换为仅小时?

Java 如何将两个日期的差异转换为仅小时?,java,time,Java,Time,我想以小时和分钟为单位显示两个日期之间的时差HH:mm。如果差异超过24小时,则天数/年份差异也应仅显示为总小时数 我有以下内容,但它可能不正确的闰年为例。所以我觉得这不是正确的方法。我还必须考虑格林尼治标准时间的差异。我如何改进这一点: Calendar start; //eg 18.11.2013+05:00 Calendar end; //eg 20.11.2013-03:00 int years = end.get(Calendar.YEAR) - start.get(Calendar

我想以小时和分钟为单位显示两个日期之间的时差
HH:mm
。如果差异超过24小时,则天数/年份差异也应仅显示为总小时数

我有以下内容,但它可能不正确的闰年为例。所以我觉得这不是正确的方法。我还必须考虑格林尼治标准时间的差异。我如何改进这一点:

Calendar start; //eg 18.11.2013+05:00
Calendar end; //eg 20.11.2013-03:00

int years = end.get(Calendar.YEAR) - start.get(Calendar.YEAR);
int days = end.get(Calendar.DAY) - start.get(Calendar.DAY);
int hours = end.get(Calendar.HOUR) - start.get(Calendar.HOUR) + days * 24 + years * 365;
int minutes = end.get(Calendar.MINUTE) - start.get(Calendar.MINUTE);

//...format(HH:mm)

我更愿意在不添加传统库的情况下实现这一点。

我建议您使用优秀的库,而不是有缺陷的java.util.Date和friends。你可以简单地写

 // Create Calendar instance
        Calendar calendar1 = Calendar.getInstance();
        Calendar calendar2 = Calendar.getInstance();

        // Set the values for the calendar fields YEAR, MONTH, and DAY_OF_MONTH.
        calendar1.set(2012, 2, 12);
        calendar1.set(2011, 3, 12);

        /*
         * Use getTimeInMillis() method to get the Calendar's time value in
         * milliseconds. This method returns the current time as UTC
         * milliseconds from the epoch
         */
        long miliSecondForDate1 = calendar1.getTimeInMillis();
        long miliSecondForDate2 = calendar2.getTimeInMillis();

        // Calculate the difference in millisecond between two dates
        long diffInMilis = miliSecondForDate2 - miliSecondForDate1;

        /*
         * Now we have difference between two date in form of millsecond we can
         * easily convert it Minute / Hour / Days by dividing the difference
         * with appropriate value. 1 Second : 1000 milisecond 1 Hour : 60 * 1000
         * millisecond 1 Day : 24 * 60 * 1000 milisecond
         */

        long diffInSecond = diffInMilis / 1000;
        long diffInMinute = diffInMilis / (60 * 1000);
        long diffInHour = diffInMilis / (60 * 60 * 1000);
        long diffInDays = diffInMilis / (24 * 60 * 60 * 1000);

        System.out.println("Difference in Seconds : " + diffInSecond);
        System.out.println("Difference in Minute : " + diffInMinute);
        System.out.println("Difference in Hours : " + diffInHour);
        System.out.println("Difference in Days : " + diffInDays);
import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.joda.time.Duration;

long someMethod(){
    DateTime start = new DateTime(2004, 12, 25, 0, 0, 0, 0);
    DateTime end = new DateTime(2005, 1, 1, 0, 0, 0, 0);
    Interval interval = new Interval(start, end);
    Duration duration = interval.toDuration(); //duration represents time in ms, from here do your conversions to any other unit.
    return duration.getStandardHours()
}

我建议您使用优秀的库,而不是有缺陷的java.util.Date和friends。你可以简单地写

import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.joda.time.Duration;

long someMethod(){
    DateTime start = new DateTime(2004, 12, 25, 0, 0, 0, 0);
    DateTime end = new DateTime(2005, 1, 1, 0, 0, 0, 0);
    Interval interval = new Interval(start, end);
    Duration duration = interval.toDuration(); //duration represents time in ms, from here do your conversions to any other unit.
    return duration.getStandardHours()
}

尝试使用
TimeUnit.HOURS.convert
方法

Calendar date1=...
Calendar date2=..
long hour= TimeUnit.HOURS.convert
          (date2.getTimeInMillis() -date1.getTimeInMillis(),
           TimeUnit.MILLISECONDS)

尝试使用
TimeUnit.HOURS.convert
方法

Calendar date1=...
Calendar date2=..
long hour= TimeUnit.HOURS.convert
          (date2.getTimeInMillis() -date1.getTimeInMillis(),
           TimeUnit.MILLISECONDS)

如果您需要考虑闰年、节省时间等因素,我建议您使用Joda time library。请看这里

在Java8中,有一个Java.time包用于此,请查看此处的文档

如果您需要考虑闰年、节省时间等因素,我建议您使用Joda时间库。请看这里

在Java8中,有一个Java.time包用于此,请查看此处的文档

这与使用另一个答案中发布的
date.getTimeInMillis()
方法有什么不同吗?就结果而言,没有。就代码行而言,你可以很清楚地看到:)使用该类代码更少:
小时间隔(开始、结束)
这与使用另一个答案中发布的
date.getTimeInMillis()
方法有什么不同吗?就结果而言,没有。就代码行而言,你可以很清楚地看到:)使用该类代码更少:
小时间隔(开始,结束)这会考虑GTM偏移和夏令时吗?那么这将是最好的方法。这会考虑GTM补偿和夏令时吗?那么这将是最好的方法。