Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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 Streams API正确过滤介于开始日期和结束日期之间的日期?_Java_Spring Boot_Java Stream_Jhipster_Localdate - Fatal编程技术网

如何使用Java Streams API正确过滤介于开始日期和结束日期之间的日期?

如何使用Java Streams API正确过滤介于开始日期和结束日期之间的日期?,java,spring-boot,java-stream,jhipster,localdate,Java,Spring Boot,Java Stream,Jhipster,Localdate,因此,我一直在使用Java Streams API,并尝试在我的数据库中过滤日期,其中某些内容的开始日期在当前日期之前,而结束日期在当前日期之后。我试过很多种方法,但到目前为止,我试过的似乎都不管用 以下是我迄今为止所尝试的: 我尝试实现ChronoLocalDate接口,并使用了.isBefore()和.isAfter()`,但日期过滤不正确 此时,我尝试使用LocalDate,并尝试使用以下代码将LocalDate.now()转换为yyyy-MM-dd格式(这是我数据库中的日期格式): 但是

因此,我一直在使用Java Streams API,并尝试在我的数据库中过滤日期,其中某些内容的开始日期在当前日期之前,而结束日期在当前日期之后。我试过很多种方法,但到目前为止,我试过的似乎都不管用

以下是我迄今为止所尝试的:

我尝试实现
ChronoLocalDate
接口,并使用了
.isBefore()和
.isAfter()`,但日期过滤不正确

此时,我尝试使用
LocalDate
,并尝试使用以下代码将
LocalDate.now()
转换为
yyyy-MM-dd
格式(这是我数据库中的日期格式):

但是,这不起作用,并导致以下错误:

The method format(DateTimeFormatter) is undefined for the type LocalDate
我从各种各样的例子中得到了上面的代码。
LocalDate.format()
是否已折旧

此外,我还没有找到任何使用LocalDate在开始日期和结束日期之间进行过滤的相关示例


如果您能从这里得到任何帮助,我们将不胜感激。提前感谢。

好吧,您可以使用
Java8-streams
LocalDate
执行如下操作

    public static void main(String[] args) {
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String startTextDateFromDB = "2019-03-14";
        String endTextDateFromDB = "2019-05-14";
        LocalDate startDate = LocalDate.parse(startTextDateFromDB, dateFormatter);
        LocalDate endDate = LocalDate.parse(endTextDateFromDB, dateFormatter);
        List<LocalDate> getList = getDatesInBetween(startDate, endDate);
        System.out.println(Arrays.asList(getList));

    }

    //return a list of all localdates between two dates
    public static List<LocalDate> getDatesInBetween(
            LocalDate startDate, LocalDate endDate) {
        //get numbers between two dates
        long numbersBetween = ChronoUnit.DAYS.between(startDate, endDate);
        //collect each localdate from start date until end date 
        return IntStream.iterate(0, i -> i + 1)
                .limit(numbersBetween)
                .mapToObj(i -> startDate.plusDays(i))
                .collect(Collectors.toList());        
    }
}
LocalDate now = LocalDate.now();
List<LocalDate> dates = dbEntries.stream()
    .filter(t -> t.getStartDate().compareTo(now) < 0 && t.getEndDate().compareTo(now) > 0)
    .collect(Collectors.toList());
publicstaticvoidmain(字符串[]args){
DateTimeFormatter dateFormatter=模式的DateTimeFormatter.of(“yyyy-MM-dd”);
字符串startTextDateFromDB=“2019-03-14”;
字符串endTextDateFromDB=“2019-05-14”;
LocalDate startDate=LocalDate.parse(startTextDateFromDB,dateFormatter);
LocalDate endDate=LocalDate.parse(endTextDateFromDB,dateFormatter);
List getList=getDatesInBetween(开始日期,结束日期);
System.out.println(Arrays.asList(getList));
}
//返回两个日期之间的所有LocalDate的列表
公共静态列表getDatesInBetween(
LocalDate开始日期,LocalDate结束日期){
//获取两个日期之间的数字
long numbersBetween=ChronoUnit.DAYS.between(开始日期、结束日期);
//收集从开始日期到结束日期的每个localdate
返回IntStream.iterate(0,i->i+1)
.限制(数字介于之间)
.mapToObj(i->startDate.plusday(i))
.collect(Collectors.toList());
}
}

下面是一个如何应用过滤器的示例。我假设您有一个包含
Foo
元素的列表,这个类有两个字段:
startDate
endDate

    public static void main(String[] args) {
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String startTextDateFromDB = "2019-03-14";
        String endTextDateFromDB = "2019-05-14";
        LocalDate startDate = LocalDate.parse(startTextDateFromDB, dateFormatter);
        LocalDate endDate = LocalDate.parse(endTextDateFromDB, dateFormatter);
        List<LocalDate> getList = getDatesInBetween(startDate, endDate);
        System.out.println(Arrays.asList(getList));

    }

    //return a list of all localdates between two dates
    public static List<LocalDate> getDatesInBetween(
            LocalDate startDate, LocalDate endDate) {
        //get numbers between two dates
        long numbersBetween = ChronoUnit.DAYS.between(startDate, endDate);
        //collect each localdate from start date until end date 
        return IntStream.iterate(0, i -> i + 1)
                .limit(numbersBetween)
                .mapToObj(i -> startDate.plusDays(i))
                .collect(Collectors.toList());        
    }
}
LocalDate now = LocalDate.now();
List<LocalDate> dates = dbEntries.stream()
    .filter(t -> t.getStartDate().compareTo(now) < 0 && t.getEndDate().compareTo(now) > 0)
    .collect(Collectors.toList());
localdatenow=LocalDate.now();
列表日期=dbEntries.stream()
.filter(t->t.getStartDate().compareTo(现在)<0和&t.getEndDate().compareTo(现在)>0)
.collect(Collectors.toList());
SpringBoot可能能够自动将数据库中的日期转换为适当的时间实例。可能需要使用注释。

在SQL中过滤 所以我一直在使用Java Streams API,并尝试在数据库中过滤日期

这是一个矛盾。如果作为查询的一部分过滤数据库中的日期(通常是最好的方法),那么就不需要Java流

SQL中的半开放查询 写下你的疑问。我假设我们正在查询一对数据类型类似于SQL标准
DATE
类型的列,查询的是一个只包含日期的值,该值没有一天中的时间,也没有时区

在这个查询代码中,我们使用半开放的方法,其中开始是包含的,而结束是独占的。这通常是处理时间跨度的最佳方法

String sql = "SELECT * FROM event_ WHERE start_ <= ? AND stop_ > ? ;" ;
如果要使用JVM的当前默认时区,请请求它并将其作为参数传递。如果省略,代码将变得模棱两可,我们无法确定您是否打算使用默认值,或者您是否像许多程序员一样不知道这个问题

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
LocalDate today = LocalDate.now( z ) ;
传递占位符的值 我们有今天的日期,所以把它传给你准备好的声明

myPreparedStatement.setObject( 1 , today ) ;
myPreparedStatement.setObject( 2 , today ) ;
Java中的过滤器 通常,最好在SQL中执行尽可能多的过滤,以便在数据库的服务器端执行。强大的企业级数据库引擎(如)针对此类工作进行了高度优化

但是,也许您有一些理由在Java中而不是在数据库中这样做

您必须在Java中逐行检索。所以你最好先过滤一下。这意味着不需要Java流。只需比较开始值和停止值的
LocalDate

我已经尝试实现了ChronoLocalDate接口,并使用了.isBefore()和.isAfter()`,但是日期没有正确过滤

您似乎对java.time在这方面的工作方式感到困惑该接口不供您实现。该接口已在世界其他大部分地区的西部普遍使用的日历系统类中实现。该接口是为实现各种日历系统的作者而存在的,而不是为您和我。至少有十几个这样的日历系统已经为Java实现,包括一些与Java捆绑的日历,如伊斯兰日历、日本日历和泰国日历

顺便说一下,java.time JavaDoc解释说,通常应该避免使用更通用的接口。如上文所述,它们的存在主要是为了实现日历系统的人的利益。在日常业务编程中,通常应该使用更具体的类。例如,
LocalDate
而不是
ChronoLocalDate

要比较
LocalDate
对象,请调用、、
equals
compareTo
方法

List< Event > events = new ArrayList<>() ;
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
    …
    LocalDate start = rs.getObject( "start_" , LocalDate.class ) ;
    LocalDate stop = rs.getObject( "stop_" , LocalDate.class ) ;
    if( ( ! start.isAfter( today ) ) && ( stop.isBefore( today ) ) { 
        Event event = … ;
        events.add( event ) ;
    } else { 
        // Skip this row. Does not meet our criterion of containing today's date.
    }
}
智能对象,而不是哑字符串
LocalDate rightNow=LocalDate.now()
String formatString=rightNow.format(DateTimeFormatter.ISO\u LOCAL\u DATE)

为什么要生成字符串?鉴于你的问题陈述,我认为没有必要使用字符串。使用日期时间时
List< Event > events = new ArrayList<>() ;
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
    …
    LocalDate start = rs.getObject( "start_" , LocalDate.class ) ;
    LocalDate stop = rs.getObject( "stop_" , LocalDate.class ) ;
    LocalDateRange dateRange = LocalDateRange.of( start , stop ) ;   // Instantiate the date range.
    if( ( dateRange.contains( today ) ) {                            // Call `LocalDateRange::contains` rather than write our own comparison logic.
        Event event = … ;
        events.add( event ) ;
    } else { 
        // Skip this row. Does not meet our criterion of containing today's date.
    }
}