Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java过滤日期_Java_Date_Simpledateformat - Fatal编程技术网

用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

我正在用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 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
    tp
    LocalDate.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());
    }