我已经构建了一个自定义数据网格,并添加了一些过滤器。我有一个过滤器是日期过滤器,用于显示日期的单元格。我的问题是单元格可能显示
Displayed date value : 21/01/2014 , Actual date object value : 21-01-2014 16:32:0000
当然,用户不知道小时部分,所以当他/她提供相同的日、月、年的过滤值时,希望看到匹配的元素。这当然不会发生,因为比较器比较具有不同小时值的日期对象。
我想问的是,是否有一种根据显示格式比较两个日期对象的首选方法?我可以实现这个逻辑,我只是好奇是否已经存在一些实现。
更新我有两个日期对象:
- 21-01-2014 16:32:0000
- 21-01-2014 00:00:0000
和显示格式:"dd/MM/yyyy"
根据格式是否有组合这两个日期的首选方法?这意味着只比较包含在格式中的日期部分。在上面的例子中,只比较日(dd)、月(MM)、年(yyyy)。
我重复一下,我可以自己实现一些简单的东西,我只是好奇是否有人遇到过这个问题,并找到了一个通用的解决方案。
如果您正在客户端寻找解决方案(Java代码由GWT编译器编译为Javascript), Krzysztof的解决方案将不起作用。GWT在客户端不支持Calendar
和相关类。也不支持SimpleDateFormat
,必须使用DateTimeFormat
。
CalendarUtil
中有一个有用的实用程序类。它有一个isSameDate(java.util.Date date0, java.util.Date date1)
方法,这正是你想要的:
检查两个日期是否代表同一年的同一天,即使它们有不同的时间。
顺便说一句,它还有一个resetTime(java.util.Date date)
方法,在你的用例中可能很有用:
将日期重置为没有时间修饰符。
在比较之前,以这种方式修改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
}
在Java中使用LocalDate
处理任何日期/时间。阅读这个帖子,了解为什么使用LocalDate
比其他旧选项更有利。
话虽如此,你所需要做的就是比较你的Date
(s)在你要求的格式(dd/MM/yyyy)是:
设date1
和date2
为具有您输入日期的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));
如果你喜欢的话,你可以用一行代码来完成,但是我认为这样更容易读懂。