【问题标题】:Compare dates depending on format根据格式比较日期
【发布时间】:2015-05-29 10:08:13
【问题描述】:

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

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

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

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

更新

我有两个日期对象:

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

和显示格式:“dd/MM/yyyy”

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

我再说一遍,我可以自己实现一些简单的东西,我只是好奇之前是否有人遇到过这种情况并找到了通用的解决方案。

【问题讨论】:

  • 我无法理解您的要求
  • 我已经更新了我的问题

标签: java date gwt comparison


【解决方案1】:

如果您正在客户端寻找解决方案(Java 代码由 GWT 编译器编译为 Javascript),Krzysztof's 解决方案将不起作用。 GWT does not support Calendar and related classes 在客户端。 SimpleDateFormat 也不支持 - DateTimeFormat has to be used instead

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

检查两个日期是否代表同一年的同一日期,即使它们的时间不同。

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

将日期重置为没有时间修饰符。

【讨论】:

  • 我正在更改已接受的答案。我已经知道所有以前的答案(这当然不会降低这些答案的价值,只是我想要一些不太常见的东西)。
  • 问题是关于 java,而不是 GWT。当然,您可以将库用于任何事情,但仅仅因为某个库有一个微不足道的方法而使用它是可笑的。
  • 为什么投反对票?你确定你了解Java和GWT之间的关系吗?如果您不这样做,请不要盲目地投票(无论您是谁)。我推断问题是关于基于 OP 使用的标签的 GWT。加上“自定义数据网格”部分。我同意应该在问题中更清楚地说明它,但似乎这是正确的结论,因为 OP 很乐意使用与 GWT 捆绑的类。我当然同意不应该只为一种简单的实用方法包含一个庞大的库,OP 可能也同意,但他已经在使用 GWT。
  • 使用CalendarLocalDate 的另外两个答案只是不起作用(它们不会编译)。我同意它们是“纯”Java 中的“正确”/首选方式。不幸的是,由于 GWT 在客户端不支持这些类(如 OP 所述,他正在尝试为他的“自定义数据网格”编写过滤器 - 所以我们正在客户端工作),我提出了一种不同的方法,使用 GWT 提供的实用程序类正好可以解决那些缺失的类。
【解决方案2】:

在比较之前以这种方式修改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();

它会将其修剪为相同的日期值,因此您可以比较两个日期是否相同,但由于您已将它们修剪为日期值,因此无论之前的几个小时如何比较,这些日期都会返回 true,分、秒和毫秒值。

或者你可以这样做:

    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
    }

【讨论】:

  • 是的,我也这么想,但我很好奇是否存在更好的东西。赞成。
【解决方案3】:

使用LocalDate 处理Java 中的任何日期/时间。阅读 this 帖子,了解为什么使用 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));

如果这是你的事情,你可以在单行中做到这一点,但我认为这种方式更具可读性。

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多