2011-10-06 173 views
27

在给定两个Date对象的情况下,如何比较两个日期对象之间的差异,完全忽略年,月和日?只比较两个日期的时间部分,忽略日期部分

这与this question完全相反。

UPDATE:这里以供将来参考最终代码:

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(); 
} 
+2

是的,它的作用。为什么不呢? – kolrie

+0

这个解决方案的讽刺之处在于,你需要在long类型的基元周围使用两个薄的包装器对象,调用一个庞大而复杂的API来将多个元素转换为Calendar对象...只能最终返回到某个地方,重新从Calendar对象转换为长整型。 – scottb

+0

@scottb - 请参阅下面的[我的答案](http://stackoverflow.com/questions/7676149#7676307),它不会混淆“日历”对象,但只使用“日期”成员。 –

回答

29

如果你想比较底层的二进制(长整型)的日期值,你可以这样做:

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

这种技术具有速度优势,因为它直接使用Date对象的基础long值,而不是在滴答和日历组件之间转换(这相当昂贵且速度慢)。这也比对Calendar对象简单得多。

附录2

上面的代码返回的时间差作为int,这将是任何对次正确的,因为它忽略日期的年/月/日的部分完全和任何两次之间的差值不超过86,400,000  ms(=  1000ms/sec × 60秒/分钟×60分钟/小时×24小时/天)。

+0

这是最好的答案,imo。不需要使用复杂的Calendar API来比较Date对象中的时间值。 – scottb

+0

这是完美和智能 –

+0

thnx大卫,正是我在找:) :) –

5

看看在Calendar类。它支持从给定的Date提取小时,分钟和秒钟。

Calendar calendar = Calendar.getInstance(); 
calendar.setTime(yourDateObject); 
int hour = calendar.get(Calendar.HOUR); 
int minute = calendar.get(Calendar.MINUTE); 
int second = calendar.get(Calendar.SECOND); 
+0

Calendar.HOUR_OF_DAY更合适(24小时而不是12) – IHeartAndroid

1

如果你不能使用JODA,

创建2个日历对象,设置年,月,日,以0

比较他们....

19

您可能考虑使用乔达时间的DateTimeComparator.getTimeOnlyInstance()作比较器,比较器仅根据时间比较两个乔达日期。

例如:

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

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

+0

如果(java)时间是问题,JODA是答案:D – bbaja42

+0

@ bbaja42不是你使用GWT:/ – displayname

1

如果JODA不是一个选项,最短的方法之一可能是将时间转换为字符串,然后比较它们。

DateFormat df = new SimpleDateFormat("HHmmssSZ"); 
df.format(date1).equals(df.format(date2)); 
0

不知道该怎么好实践或efficent是这一个,但我一直在使用日期对象,担任我的目的而编写一个简单的函数。它返回一个真或假的第一个日期值比第二个大。输入d1 & & d2是Date对象。

function CompareTimes(d1, d2) { 
      if (d1.getHours() < d2.getHours()) { 
       return false; 
      } 
      if (d1.getHours() > d2.getHours()) { 
       return true; 

      } else { 
       return (d1.getMinutes() > d2.getMinutes()); 
      } 
}; 
0

,如果你只是想日期的时间部分比较那么这会给你正确的结果 -

public long compareTimes(Date d1, Date d2) 
    { 
     long  t1; 
     long  t2; 
     t1 = d1.getHours()*60*60+d1.getMinutes()*60+d1.getSeconds(); 
     t2 = d2.getHours()*60*60+d2.getMinutes()*60+d2.getSeconds(); 
     long diff = t1-t2; 
     System.out.println("t1 - "+t1+", t2 - "+t2+", diff - "+diff); 

     return diff; 
    } 
相关问题