仅比较两个日期的时间部分,忽略日期部分

2022-09-01 06:35:41

给定两个 Date 对象,仅比较其时间部分之间的差异,完全忽略年、月和日,这有什么好方法?

这与这个问题完全相反。

更新:以下是最终代码,供将来参考:

private long differenceBetween(Date currentTime, Date timeToRun)
{
    Calendar currentCal = Calendar.getInstance();
    currentCal.setTime(currentTime);

    Calendar runCal = Calendar.getInstance();
    runCal.setTime(timeToRun);
    runCal.set(Calendar.DAY_OF_MONTH, currentCal.get(Calendar.DAY_OF_MONTH));
    runCal.set(Calendar.MONTH, currentCal.get(Calendar.MONTH));
    runCal.set(Calendar.YEAR, currentCal.get(Calendar.YEAR));

    return currentCal.getTimeInMillis() - runCal.getTimeInMillis();
}

答案 1

如果要比较日期的基础二进制(长整型)值,可以执行以下操作:

public int compareTimes(Date d1, Date d2)
{
    int     t1;
    int     t2;

    t1 = (int) (d1.getTime() % (24*60*60*1000L));
    t2 = (int) (d2.getTime() % (24*60*60*1000L));
    return (t1 - t2);
}

增编1

这种技术具有速度的优点,因为它直接使用对象的基础值,而不是在刻度和日历组件之间转换(这相当昂贵和缓慢)。这也比弄乱对象简单得多。longDateCalendar

增编2

上面的代码将时差返回为 an ,这对于任何一对时间都是正确的,因为它完全忽略了日期的年/月/日部分,并且任意两个时间之间的差异不超过 86,400,000 毫秒(= 1000 毫秒/秒× 60 秒/分钟× 60 分钟/小时× 24 小时/天)。int


答案 2

您可以考虑使用Joda时间作为比较器,该比较器将仅根据时间比较两个Joda日期。DateTimeComparator.getTimeOnlyInstance()

例如:

DateTimeComparator comparator = DateTimeComparator.getTimeOnlyInstance();
comparator.compare(date1, date2);

请参见 http://joda-time.sourceforge.net/api-release/org/joda/time/DateTimeComparator.html#getTimeOnlyInstance()