7

I ran into a problem where I wanted to compare two dates. However, I only wanted to compare Year, Month and Day. And this is what I can up with:

 private Date trim(Date date) {

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR, 0);
        return calendar.getTime();
    }

I user this function to trim all units but days, months and years.

Now, the question is what do you think about it? Do you know any other way to do so?

Thanks

4

5 回答 5

8

你真的需要使用java.util.Date吗?如果您可以切换到joda time,您会发现非常好的功能,例如:

dateTime.dayOfMonth().roundFloorCopy()

这正是您需要的。

于 2013-07-06T00:05:57.657 回答
6

您的代码有效且易于阅读。我没有看到任何问题或改变它的理由。

于 2013-07-05T23:41:45.363 回答
4

现在,问题是你这样做的目的是什么?

它看起来简单而合理。您正在创建一个新Date的临时Calendar对象,但这只是很小的开销。(...除非您使用它来对大型数据结构进行排序/排序...)

IMO,可能不需要更改它。

你知道其他方法吗?

  1. 开发/使用Comparator<Date>仅使用您感兴趣的字段的 a,使用 aCalendar提取它们。

    这是否会有所帮助取决于您当前进行比较的方式。比较器可能更整洁。但另一方面,您可能最终会反复进行转换,并且Comparator<Date>没有给您任何缓存转换日期的空间。

  2. 使用返回的值进行计算Date.getTime()。大致是这样的:

    long val = date.getTime(); // milliseconds since 'epoch' in UTC 
    val = val + /* local timezone offset in milliseconds */  
    long day = val / (1000 * 60 * 60 * 24); // days since "local" epoch.
    
    // repeat for other Date, and compare the 'day' numbers as integers
    

    解释,做一些简单的算术应该比使用 a Calendar(或其他)更有效。代码有点晦涩,但对于具有合理数学技能的人来说应该是显而易见的。

于 2013-07-05T23:51:45.693 回答
2

我假设您想比较两个日期,而您只想比较year,monthday.

您所做的很好,即删除hour,和. 您必须对这两个日期执行此操作。minutesecondmillisecond

修剪完成后,您将不得不使用类compareTo中的方法Date

您可以使用以下代码 -

if(date1.compareTo(date2) < 0) {
  // date1 is earlier
} else if(date1.compareTo(date2) > 0) {
  // date 2 is earlier
} else {
  // both dates are equal
}      
于 2013-07-05T23:40:44.690 回答
0

你可以试试这个,因为日期的格式是固定的:

    String first = date1.toString().substring(4,10) + " " + date.toString().substring(24, 28);
    String second = date2.toString().substring(4,10) + " " + date.toString().substring(24, 28);

这将输出

1969 年 12 月 31 日

1969 年 1 月 6 日

然后比较结果。

return (first.equals(second));

我不知道它是否比您的想法更好,但是您会得到相同的结果。

于 2013-07-06T00:00:47.767 回答