根据格式比较日期

Compare dates depending on format

我构建了自定义数据网格并添加了一些过滤器。 我有一个过滤器是日期过滤器,用于显示日期的单元格。 我的问题是单元格可能显示

Displayed date value : 21/01/2014 , Actual date object value : 21-01-2014 16:32:0000

当然用户并不知道小时部分,所以当he/she提供了同日同月同年的过滤值时,希望看到匹配的元素。这当然不会发生,因为比较器比较具有不同小时值的日期对象。

我想问的是,有没有更好的方法来根据显示格式比较两个日期对象?我可以实现这个逻辑,我只是​​好奇是否已经存在一些实现。

更新

我有两个日期对象:

  1. 21-01-2014 16:32:0000
  2. 21-01-2014 00:00:0000

和显示格式:"dd/MM/yyyy"

是否有根据格式合并这两个日期的首选方法? 这意味着只比较格式中包含的日期部分。 在上面的例子中,只比较日(dd)、月(MM)、年(yyyy)。

我再说一遍,我可以自己实现一些简单的东西,我只是想知道是否有人以前遇到过这个问题并找到了通用的解决方案。

在比较之前以这种方式修改 date

    GregorianCalendar gc = new GregorianCalendar();
    gc.setTime(date);
    gc.set(GregorianCalendar.HOUR_OF_DAY, 0);
    gc.set(GregorianCalendar.SECOND, 0);
    gc.set(GregorianCalendar.MINUTE, 0);
    gc.set(GregorianCalendar.MILLISECOND, 0);

    date = gc.getTime();

它会 trim 它到同一天的值,所以你可以比较两个日期,如果它们是相同的,但是因为你已经 trim 把它们变成了一天的值,那些日期无论之前的小时、分钟、秒和毫秒值如何,进行比较时都会 return 为真。

或者你可以这样做:

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

    Date date1 = ...;

    Date date2 = ...;

    if (sdf.format(date1).equals(sdf.format(date2))) {
        // dates are equal in the day value
    }

如果您正在寻找客户端解决方案(其中 Java 代码被 GWT 编译器编译为 Java 脚本), solution will not work. GWT does not support Calendar and related classes on the client side. SimpleDateFormat is not supported either - DateTimeFormat has to be used instead.

但是 GWT 中有一个有用的实用程序 class:CalendarUtil。它有一个 isSameDate(java.util.Date date0, java.util.Date date1) 方法,可以完全满足您的需求:

Check if two dates represent the same date of the same year, even if they have different times.

顺便说一句,它还有一个 resetTime(java.util.Date date) 方法,可能对您的用例有用:

Resets the date to have no time modifiers.

对 Java 中的任何 date/time 处理使用 LocalDate。阅读 this post 了解为什么使用 LocalDate 优于其他旧选项。

话虽如此,要以您请求的格式 (dd/MM/yyyy) 比较您的 Date(s),您需要做的就是:

date1date2 成为具有您输入日期的 Date 对象。

LocalDate lD1 = new LocalDate(date1);
LocalDate lD2 = new LocalDate(date2);

String comparisonFormat = "dd/MM/yyyy";

boolean result = lD1.toString(comparisonFormat).equals(lD2.toString(comparisonFormat));

如果你喜欢的话,你可以在一行中完成这个,但我认为这样更易读。