how to get a list of dates between two dates in java

后端 未结 22 1515
余生分开走
余生分开走 2020-11-22 13:24

I want a list of dates between start date and end date.

The result should be a list of all dates including the start and end date.

相关标签:
22条回答
  • 2020-11-22 13:41

    Recommending date streams

    In Java 9, you can use following new method, LocalDate::datesUntil:

    LocalDate start = LocalDate.of(2017, 2, 1);
    LocalDate end = LocalDate.of(2017, 2, 28);
    
    Stream<LocalDate> dates = start.datesUntil(end.plusDays(1));
    List<LocalDate> list = dates.collect(Collectors.toList());
    

    The new method datesUntil(...) works with an exclusive end date, hence the shown hack to add a day.

    Once you have obtained a stream you can exploit all the features offered by java.util.stream- or java.util.function-packages. Working with streams has become so simple compared with earlier approaches based on customized for- or while-loops.


    Or if you look for a stream-based solution which operates on inclusive dates by default but can also be configured otherwise then you might find the class DateInterval in my library Time4J interesting because it offers a lot of special features around date streams including a performant spliterator which is faster than in Java-9:

    PlainDate start = PlainDate.of(2017,  2, 1);
    PlainDate end = start.with(PlainDate.DAY_OF_MONTH.maximized());
    Stream<PlainDate> stream = DateInterval.streamDaily(start, end);
    

    Or even simpler in case of full months:

    Stream<PlainDate> februaryDates = CalendarMonth.of(2017, 2).streamDaily();
    List<LocalDate> list = 
        februaryDates.map(PlainDate::toTemporalAccessor).collect(Collectors.toList());
    
    0 讨论(0)
  • 2020-11-22 13:42

    please find the below code.

    List<Date> dates = new ArrayList<Date>();
    
    String str_date ="27/08/2010";
    String end_date ="02/09/2010";
    
    DateFormat formatter ; 
    
    formatter = new SimpleDateFormat("dd/MM/yyyy");
    Date  startDate = (Date)formatter.parse(str_date); 
    Date  endDate = (Date)formatter.parse(end_date);
    long interval = 24*1000 * 60 * 60; // 1 hour in millis
    long endTime =endDate.getTime() ; // create your endtime here, possibly using Calendar or Date
    long curTime = startDate.getTime();
    while (curTime <= endTime) {
        dates.add(new Date(curTime));
        curTime += interval;
    }
    for(int i=0;i<dates.size();i++){
        Date lDate =(Date)dates.get(i);
        String ds = formatter.format(lDate);    
        System.out.println(" Date is ..." + ds);
    }
    

    output:

    Date is ...27/08/2010
    Date is ...28/08/2010
    Date is ...29/08/2010
    Date is ...30/08/2010
    Date is ...31/08/2010
    Date is ...01/09/2010
    Date is ...02/09/2010

    0 讨论(0)
  • 2020-11-22 13:42

    A tail-recursive version:

    public static void datesBetweenRecursive(Date startDate, Date endDate, List<Date> dates) {
        if (startDate.before(endDate)) {
            dates.add(startDate);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(startDate);
            calendar.add(Calendar.DATE, 1);
            datesBetweenRecursive(calendar.getTime(), endDate, dates);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 13:43

    Like as @folone, but correct

    private static List<Date> getDatesBetween(final Date date1, final Date date2) {
        List<Date> dates = new ArrayList<>();
        Calendar c1 = new GregorianCalendar();
        c1.setTime(date1);
        Calendar c2 = new GregorianCalendar();
        c2.setTime(date2);
        int a = c1.get(Calendar.DATE);
        int b = c2.get(Calendar.DATE);
        while ((c1.get(Calendar.YEAR) != c2.get(Calendar.YEAR)) || (c1.get(Calendar.MONTH) != c2.get(Calendar.MONTH)) || (c1.get(Calendar.DATE) != c2.get(Calendar.DATE))) {
            c1.add(Calendar.DATE, 1);
            dates.add(new Date(c1.getTimeInMillis()));
        }
        return dates;
    }
    
    0 讨论(0)
  • 2020-11-22 13:44

    With java 8

    public Stream<LocalDate> getDaysBetween(LocalDate startDate, LocalDate endDate) {
        return IntStream.range(0, (int) DAYS.between(startDate, endDate)).mapToObj(startDate::plusDays);
    }
    
    0 讨论(0)
  • 2020-11-22 13:44
     public static List<Date> getDaysBetweenDates(Date startDate, Date endDate){
            ArrayList<Date> dates = new ArrayList<Date>();
            Calendar cal1 = Calendar.getInstance();
            cal1.setTime(startDate);
    
            Calendar cal2 = Calendar.getInstance();
            cal2.setTime(endDate);
    
            while(cal1.before(cal2) || cal1.equals(cal2))
            {
                dates.add(cal1.getTime());
                cal1.add(Calendar.DATE, 1);
            }
            return dates;
        }
    
    0 讨论(0)
提交回复
热议问题