如何对p:列中的Date类型进行筛选



我的filterBy有问题。当数据是日期,但它可以与其他类型的数据一起使用时,我使用了一个我已经在控制器中指定的filterFunction,但它不起作用。当我进行筛选时,没有任何变化。这是我的代码:

我的.xhtml文件:

<p:column  filterBy="#{deploiement.date_deploiement_test}" 
sortBy="#{deploiement.date_deploiement_test}"   headerText="date du déploiement version_test" filterFunction="#{listDeploiementController.filterByDate(value, filter, locale)}">
<h:outputText value="#{deploiement.date_deploiement_test}"> 
<f:convertDateTime pattern="dd-MM-yyyy HH:mm"  />
</h:outputText>
</p:column>

我的控制器:

private static final Logger LOG = Logger.getLogger(ListDeploiementController.class.getName());

public boolean filterByDate(Object value, Object filter, Locale locale) {


String filterText = (filter == null) ? null : filter.toString().trim();
if (filterText == null || filterText.isEmpty()) {
return true;
}
if (value == null) {
return false;
}
DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm");

Date filterDate = (Date) value;

Date dateFrom;
Date dateTo;
try {
String fromPart = filterText.substring(0, filterText.indexOf("-"));
String toPart = filterText.substring(filterText.indexOf("-") + 1);
dateFrom = fromPart.isEmpty() ? null : df.parse(fromPart);
dateTo = toPart.isEmpty() ? null : df.parse(toPart);
} catch (ParseException pe) {
LOG.log(Level.SEVERE, "unable to parse date: " + filterText, pe);
return false;
}
return (dateFrom == null || filterDate.after(dateFrom)) && (dateTo == null || filterDate.before(dateTo));
}

如果有人知道解决方案,请告诉我如何修复它。我的项目真的需要它

谢谢。

您的代码有两个问题:

  1. 错误地拆分filterText
  2. 没有意识到一个Date对象可能在另一个对象之前/之后,甚至相差一毫秒,而您打算仅根据天、月、年、小时和分钟来评估之前/之后

我建议您使用现代java.time日期时间API和相应的格式API(包,java.time.format(,而不是过时且错误的java.util日期时间API和SimpleDateFormat。从跟踪:日期时间了解有关现代日期时间API的更多信息。

假设filterText类似于10-12-2018 17:05 - 05-08-2020 11:25,我会这样做:

public static boolean filterByDate(Object value, Object filter, Locale locale) {
String filterText = (filter == null) ? null : filter.toString().trim();
if (filterText == null || filterText.isEmpty()) {
return true;
}
if (value == null) {
return false;
}
// Get LocalDateTime from java.util.Date
Date filterDateValue = (Date) value;
LocalDateTime filterDate = filterDateValue.toInstant().atOffset(ZoneOffset.UTC).toLocalDateTime();
// Define formatter
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
// Split filterText on ' - '
String[] parts = filterText.split("\s-\s");
String fromPart = parts[0];
String toPart = parts[1];
// Parse parts into LocalDateTime instances
LocalDateTime dateFrom = null;
LocalDateTime dateTo = null;
try {
dateFrom = LocalDateTime.parse(fromPart, formatter);
dateTo = LocalDateTime.parse(toPart, formatter);
} catch (DateTimeParseException e) {
System.out.println("Invalid dates in the filter criteria");
}
return (dateFrom == null || filterDate.isAfter(dateFrom)) && (dateTo == null || filterDate.isBefore(dateFrom));
}

相关内容

  • 没有找到相关文章

最新更新