用Java过滤日期
我正在用Java尝试过滤器,我不能用“选择…”来查找结果 问题是我的对象总是加入我的数组 我的数据是->用Java过滤日期,java,date,simpledateformat,Java,Date,Simpledateformat,我正在用Java尝试过滤器,我不能用“选择…”来查找结果 问题是我的对象总是加入我的数组 我的数据是-> Registro 1-> Fecha Inicio "2018-09-01" , Fecha Fin -> "2018-09-30" Registro 2-> Fecha inicio "2018-10-01" , Fecha Fin -> "2018-10-05" Registro 3-> Fecha inicio "2017-12-31" , Fecha F
Registro 1-> Fecha Inicio "2018-09-01" , Fecha Fin -> "2018-09-30"
Registro 2-> Fecha inicio "2018-10-01" , Fecha Fin -> "2018-10-05"
Registro 3-> Fecha inicio "2017-12-31" , Fecha Fin -> "2018-11-30"
Registro 4-> Fecha inicio "2018-12-01" , Fecha Fin -> "2019-10-01"
Registro 5-> Fecha inicio "2018-12-30" , Fecha Fin -> "2018-12-31"
Registro 6-> Fecha inicio "2018-11-30" , Fecha Fin -> "2018-12-01"
用户为过滤器插入->“2018-12-01”hasta el“9999-31-12”
寄存器4应插入阵列,因为我的用户插入“2018-12-01”和我的寄存器具有相同的起始日期
寄存器5º应插入阵列,因为我的用户插入“2018-12-01”并完成年份->9999
,然后我的寄存器应插入阵列
寄存器6º->应插入数组,因为日期结束,因为其结束日期对应于用户的开始日期和结束日期之间的时间段,即用户希望介于“2018-12-01”到“9999-31-12”之间,并且注册日期结束为“2018-12-01”
公共列表过滤器结果(字符串参数选择、字符串日期开始、字符串日期结束){
List=Collections.emptyList();
试一试{
//中印两国在财政上有很大不同。
if(dateStart!=null&&dateEnd==null){
dateEnd=“9999-31-12”;
list=(list)this.pgRepository.findAll();
list=this.getStart(list,dateStart,dateEnd);
}
}捕获(例外e){
LOGGER.error(例如getMessage());
}
退货清单;
}
私有列表getStart(列表列表、字符串dateStart、字符串dateEnd)引发ParseException{
DateFomrat df=新的简化格式(“yyyy-MM-dd”);
dateuserdate=df.parse(dateStart);
dateuserend=df.parse(dateEnd);
列表过滤器=新的ArrayList();
用于(物品参数:列表){
dateparamstart=df.parse(param.getStartdatevalidity());
日期参数=df.parse(param.getEnddatevalidity());
if(paramStart.after(userDate)| paramEnd.before(userDate)&¶mStart.after(userEnd)| paramEnd.before(userEnd)){
filter.add(参数);
}
}
回流过滤器;
}
我有两个问题->
1º我的目标在我的阵法中始终受到保护。我不知道我的逻辑是否正确
感谢并为我的英语感到抱歉。编辑2-删除此处提出的问题,以获得更多澄清,因为Ole V.V的答案中包含了这一概念,我认为这是一个明确的有用答案 我根据提供的详细信息提出的建议-
boolean java.util.Date.after(日期-时间)
//原始代码中的更改建议
if(paramStart.after(userDate)| paramEnd.before(userDate)paramEnd.before(userEnd)){
filter.add(参数);
}
int java.util.Date.compareTo(java.util.Date另一个日期)
我想你想要这个:
if (! (paramEnd.before(userDate) || paramStart.after(userEnd))) {
filter.add(param);
}
是的,这很简单。你可以说我已经扭转了这种状况。您不希望文章的有效期在userDate
之前结束,也不希望文章的有效期在userEnd
之后开始。所有其他文章都与用户间隔重叠,因此都包括在内
也就是说,您使用的Date
类早已过时,并且存在许多设计问题。而SimpleDateFormat
以麻烦著称。此外,日期
尽管其名称并不代表日期,但代表时间点。我建议您使用java.time中的LocalDate
,现代java日期和时间API,在文章
类中以及在搜索和筛选代码中表示日期。作为额外的奖励,LocalDate
解析您的日期格式yyyy-MM-dd
,无需任何明确的格式设置程序,因为该格式是标准格式(也称为ISO 8601)。例如:
public class Article {
LocalDate startDateValidity;
LocalDate endDateValidity;
// Note that this constructor accepts string arguments for convenience
public Article(String startValidity, String endValidity) {
this.startDateValidity = LocalDate.parse(startValidity);
this.endDateValidity = LocalDate.parse(endValidity);
}
// getters etc.
}
在filterResult
中,将dateStart
和dateEnd
解析为LocalDate
,方法与上面的构造函数相同。如果缺少dateEnd
,请设置userEnd
tpLocalDate.MAX
。当所有日期均为LocalDate
时,您的if
条件变化不大;方法名称前面有一个is
:
if (! (paramEnd.isBefore(userDate) || paramStart.isAfter(userEnd))) {
filter.add(param);
}
编辑:让我们测试一下。
使用问题中的6个注册日期:
List<Article> list = Arrays.asList(
new Article("2018-09-01", "2018-09-30"),
new Article("2018-10-01", "2018-10-05"),
new Article("2017-12-31", "2018-11-30"),
new Article("2018-12-01", "2019-10-01"),
new Article("2018-12-30", "2018-12-31"),
new Article("2018-11-30", "2018-12-01"));
LocalDate userDate = LocalDate.parse("2018-12-01");
LocalDate userEnd = LocalDate.MAX;
for(Article param : list) {
LocalDate paramStart = param.getStartDateValidity();
LocalDate paramEnd = param.getEndDateValidity();
if (! (paramEnd.isBefore(userDate) || paramStart.isAfter(userEnd))) {
System.out.println("Included " + param);
}
}
您将识别注册号4、5和6的日期,这些日期是您说过要插入过滤器阵列的日期
你的代码出了什么问题?
我有两个问题->1º我的目标在我的阵列中始终受到保护。我不知道我的逻辑是否正确
你的逻辑是错误的,这是正确的。让我们看看您的if
条件:
if(paramStart.after(userDate)
|| paramEnd.before(userDate) && paramStart.after(userEnd)
|| paramEnd.before(userEnd)) …
&&
的优先级高于|
,因此它被解释为在参数before(userDate)和¶mStart.after(userEnd)
周围有括号。这个条件的中间部分实际上永远不会是真的,但是如果第一部分或最后一部分是真的,那么将包含一篇文章。只有注册号5符合条件的第一部分,因为after
表示“严格遵循”。但是,所有6个注册都满足最后一部分的要求,paramEnd.before(userDate)和¶mStart.after(userEnd)
。在部件之间使用|
,这就足够将所有6个项目都包含在筛选结果中
链接
- 解释如何使用
java.time
字符串到日期的日期解析。如果用户以相同的格式存储和输入数据,那么要比较两个日期,只需比较两个字符串就足够了
另外,实际上,为了比较相同格式的大量日期列表,我们使用RadixSort作为字符串
在这种情况下,您的getStart()
方法变得非常简单:
public static List<Article> getStart(List<Article> list, String dateStart, String dateEnd) {
final Predicate<String> isInRange = date -> date.compareTo(dateStart) >= 0 && date.compareTo(dateEnd) <= 0;
final Predicate<Article> isIntersect = article -> isInRange.test(article.getStartdatevalidity()) || isInRange.test(article.getEnddatevalidity());
return list.stream().filter(isIntersect).collect(Collectors.toList());
}
公共静态列表getStart(列表列表、字符串dateStart、字符串dateEnd){
最终谓词isInRange=日期->
if(paramStart.after(userDate)
|| paramEnd.before(userDate) && paramStart.after(userEnd)
|| paramEnd.before(userEnd)) …
public static List<Article> getStart(List<Article> list, String dateStart, String dateEnd) {
final Predicate<String> isInRange = date -> date.compareTo(dateStart) >= 0 && date.compareTo(dateEnd) <= 0;
final Predicate<Article> isIntersect = article -> isInRange.test(article.getStartdatevalidity()) || isInRange.test(article.getEnddatevalidity());
return list.stream().filter(isIntersect).collect(Collectors.toList());
}