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

JavaDate

Java Problem Overview


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.

Java Solutions


Solution 1 - Java

>Back in 2010, I suggested to use Joda-Time for that. > > Note that Joda-Time is now in maintenance mode. Since 1.8 (2014), you should use java.time.

Add one day at a time until reaching the end date:

int days = Days.daysBetween(startDate, endDate).getDays();
List<LocalDate> dates = new ArrayList<LocalDate>(days);  // Set initial capacity to `days`.
for (int i=0; i < days; i++) {
    LocalDate d = startDate.withFieldAdded(DurationFieldType.days(), i);
    dates.add(d);
}

It wouldn't be too hard to implement your own iterator to do this as well, that would be even nicer.

Solution 2 - Java

java.time Package

If you are using Java 8, there is a much cleaner approach. The new java.time package in Java 8 incorporates the features of the Joda-Time API.

Your requirement can be solved using the below code:

String s = "2014-05-01";
String e = "2014-05-10";
LocalDate start = LocalDate.parse(s);
LocalDate end = LocalDate.parse(e);
List<LocalDate> totalDates = new ArrayList<>();
while (!start.isAfter(end)) {
	totalDates.add(start);
	start = start.plusDays(1);
}

Solution 3 - Java

Get the number of days between dates, inclusive.

public static List<Date> getDaysBetweenDates(Date startdate, Date enddate)
{
    List<Date> dates = new ArrayList<Date>();
    Calendar calendar = new GregorianCalendar();
    calendar.setTime(startdate);

    while (calendar.getTime().before(enddate))
    {
        Date result = calendar.getTime();
        dates.add(result);
        calendar.add(Calendar.DATE, 1);
    }
    return dates;
}

Solution 4 - Java

Streams

Edit: Joda-Time is now deprecated, changed the answer to use Java 8 instead.

Here is the Java 8 way, using streams.

List<LocalDate> daysRange = Stream.iterate(startDate, date -> date.plusDays(1)).limit(numOfDays).collect(Collectors.toList());

Solution 5 - Java

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

Solution 6 - Java

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());

Solution 7 - Java

With java 8

public Stream<LocalDate> getDaysBetween(LocalDate startDate, LocalDate endDate) {
    return IntStream.range(0, (int) DAYS.between(startDate, endDate)).mapToObj(startDate::plusDays);
}

Solution 8 - Java

Something like this should definitely work:

private List<Date> getListOfDaysBetweenTwoDates(Date startDate, Date endDate) {
    List<Date> result = new ArrayList<Date>();
    Calendar start = Calendar.getInstance();
    start.setTime(startDate);
    Calendar end = Calendar.getInstance();
    end.setTime(endDate);
    end.add(Calendar.DAY_OF_YEAR, 1); //Add 1 day to endDate to make sure endDate is included into the final list
    while (start.before(end)) {
        result.add(start.getTime());
        start.add(Calendar.DAY_OF_YEAR, 1);
    }
    return result;
}

Solution 9 - Java

With Lamma it looks like this in Java:

    for (Date d: Dates.from(2014, 6, 29).to(2014, 7, 1).build()) {
        System.out.println(d);
    }

and the output is:

    Date(2014,6,29)
    Date(2014,6,30)
    Date(2014,7,1)

Solution 10 - Java

 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;
    }

Solution 11 - Java

One solution would be to create a Calendar instance, and start a cycle, increasing it's Calendar.DATE field until it reaches the desired date. Also, on each step you should create a Date instance (with corresponding parameters), and put it to your list.

Some dirty code:

    public List<Date> getDatesBetween(final Date date1, final Date date2) {
	List<Date> dates = new ArrayList<Date>();
	
	Calendar calendar = new GregorianCalendar() {{
		set(Calendar.YEAR, date1.getYear());
		set(Calendar.MONTH, date1.getMonth());
		set(Calendar.DATE, date1.getDate());
	}};
	
	while (calendar.get(Calendar.YEAR) != date2.getYear() && calendar.get(Calendar.MONTH) != date2.getMonth() && calendar.get(Calendar.DATE) != date2.getDate()) {
		calendar.add(Calendar.DATE, 1);
		dates.add(new Date(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE)));
	}
	
	return dates;
}

Solution 12 - Java

You can also look at the Date.getTime() API. That gives a long to which you can add your increment. Then create a new Date.

List<Date> dates = new ArrayList<Date>();
long interval = 1000 * 60 * 60; // 1 hour in millis
long endtime = ; // create your endtime here, possibly using Calendar or Date
long curTime = startDate.getTime();
while (curTime <= endTime) {
  dates.add(new Date(curTime));
  curTime += interval;
}

and maybe apache commons has something like this in DateUtils, or perhaps they have a CalendarUtils too :)

EDIT

including the start and enddate may not be possible if your interval is not perfect :)

Solution 13 - Java

With Joda-Time , maybe it's better:

LocalDate dateStart = new LocalDate("2012-01-15");
LocalDate dateEnd = new LocalDate("2012-05-23");
// day by day:
while(dateStart.isBefore(dateEnd)){
	System.out.println(dateStart);
	dateStart = dateStart.plusDays(1);
}

It's my solution.... very easy :)

Solution 14 - Java

List<Date> dates = new ArrayList<Date>();
String str_date = "DD/MM/YYYY";
String end_date = "DD/MM/YYYY";
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date startDate = (Date)formatter.parse(str_date); 
Date endDate = (Date)formatter.parse(end_date);
long interval = 1000 * 60 * 60; // 1 hour in milliseconds
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);
    //Write your code for storing dates to list
}

Solution 15 - Java

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;
}

Solution 16 - Java

This is simple solution for get a list of dates

import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;  
public class DateList
{

public static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

 public static void main (String[] args) throws java.lang.Exception
 {
	
	Date dt = new Date();
	System.out.println(dt);
	
	  	List<Date> dates = getDates("2017-01-01",dateFormat.format(new Date()));
  		//IF you don't want to reverse then remove Collections.reverse(dates);
  		 Collections.reverse(dates);
	  	System.out.println(dates.size());
    for(Date date:dates)
    {
        System.out.println(date);
    }
 }
 public static List<Date> getDates(String fromDate, String toDate)
 {
    ArrayList<Date> dates = new ArrayList<Date>();
    
    try {
    
      	Calendar fromCal = Calendar.getInstance();
    	fromCal.setTime(dateFormat .parse(fromDate));

    	Calendar toCal = Calendar.getInstance();
    	toCal.setTime(dateFormat .parse(toDate));

    	while(!fromCal.after(toCal))
    	{
        	dates.add(fromCal.getTime());
        	fromCal.add(Calendar.DATE, 1);
    	}

    
    } catch (Exception e) {
        System.out.println(e);
    }
    return dates;
 }
}

Solution 17 - Java

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);
	}
}

Solution 18 - Java

Enhancing one of the above solutions. As adding 1 day to end date sometimes adds an extra day beyond the end date.

public static List<Date> getDaysBetweenDates(Date startdate, Date enddate)
{
    List<Date> dates = new ArrayList<Date>();
    Calendar startDay = new GregorianCalendar();
    calendar.setTime(startdate);
    Calendar endDay = new GregorianCalendar();
    endDay.setTime(enddate);
    endDay.add(Calendar.DAY_OF_YEAR, 1);
    endDay.set(Calendar.HOUR_OF_DAY, 0);
	endDay.set(Calendar.MINUTE, 0);
	endDay.set(Calendar.SECOND, 0);
	endDay.set(Calendar.MILLISECOND, 0);

    while (calendar.getTime().before(endDay.getTime())) {
        Date result = startDay.getTime();
        dates.add(result);
        startDay.add(Calendar.DATE, 1);
    }
    return dates;
}

Solution 19 - Java

Here is my method for getting dates between two dates, including / w.o. including business days. It also takes source and desired date format as parameter.

public static List<String> getAllDatesBetweenTwoDates(String stdate,String enddate,String givenformat,String resultformat,boolean onlybunessdays) throws ParseException{
		DateFormat sdf;
		DateFormat sdf1;
		List<Date> dates = new ArrayList<Date>();
		List<String> dateList = new ArrayList<String>();
		  SimpleDateFormat checkformat = new SimpleDateFormat(resultformat); 
		  checkformat.applyPattern("EEE");  // to get Day of week
		try{
			sdf = new SimpleDateFormat(givenformat);
			sdf1 = new SimpleDateFormat(resultformat);
			stdate=sdf1.format(sdf.parse(stdate));
			enddate=sdf1.format(sdf.parse(enddate));
			
			Date  startDate = (Date)sdf1.parse( stdate); 
			Date  endDate = (Date)sdf1.parse( enddate);
			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 = sdf1.format(lDate);   
			    if(onlybunessdays){
			    	String day= checkformat.format(lDate); 
			    	if(!day.equalsIgnoreCase("Sat") && !day.equalsIgnoreCase("Sun")){
			    		  dateList.add(ds);
			    	}
			    }else{
			    	  dateList.add(ds);
			    }
			  
			    //System.out.println(" Date is ..." + ds);
			  
			}
			
			
		}catch(ParseException e){
			e.printStackTrace();
			throw e;
		}finally{
			sdf=null;
			sdf1=null;
		}
		return dateList;
	}

And the method call would be like :

public static void main(String aregs[]) throws Exception {
		System.out.println(getAllDatesBetweenTwoDates("2015/09/27","2015/10/05","yyyy/MM/dd","dd-MM-yyyy",false));
	}

You can find the demo code : Click Here

Solution 20 - Java

List<LocalDate> totalDates = new ArrayList<>();
popularDatas(startDate, endDate, totalDates);
System.out.println(totalDates);

private void popularDatas(LocalDate startDate, LocalDate endDate, List<LocalDate> datas) {
	if (!startDate.plusDays(1).isAfter(endDate)) {
		popularDatas(startDate.plusDays(1), endDate, datas);
	} 
	datas.add(startDate);
}

Recursive solution

Solution 21 - Java

This will add all dates between two dates and It will add current dates and then new dates will be added based on loop condition.

private void onDateSet(){
    Calendar endDate = Calendar.getInstance(),startDate = Calendar.getInstance();
    startDate.set(currentYear,currentMonthOfYear,currentDayOfMonth);
    endDate.set(inputYear,inputMonthOfYear,inputDayOfMonth);
    datesToAdd(startDate,endDate);
    }
    
    //call for get dates list
    private List<Date> datesToAdd(Calendar startDate,Calendar endDate){
                    List<Dates> datesLists = new List<>();
                    while (startDate.get(Calendar.YEAR) != endDate.get(Calendar.YEAR) ||   
                           startDate.get(Calendar.MONTH) != endDate.get(Calendar.MONTH) ||
                           startDate.get(Calendar.DAY_OF_MONTH) != endDate.get(Calendar.DAY_OF_MONTH)) {
                   
                             datesList.add(new Date(startDate.get(Calendar.YEAR), startDate.get(Calendar.MONTH), startDate.get(Calendar.DATE));
    
                             startDate.add(Calendar.DATE, 1);//increas dates
                
                         }
                         return datesList;
                }

Solution 22 - Java

> java9 features you can calculate like this

public  List<LocalDate> getDatesBetween (
 LocalDate startDate, LocalDate endDate) {
 
   return startDate.datesUntil(endDate)
     .collect(Collectors.toList());
}
`` 

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionArivu2020View Question on Stackoverflow
Solution 1 - JavaAlbertView Answer on Stackoverflow
Solution 2 - JavaYadu KrishnanView Answer on Stackoverflow
Solution 3 - JavaJules RogersonView Answer on Stackoverflow
Solution 4 - JavaAmit GoldsteinView Answer on Stackoverflow
Solution 5 - JavabidyotView Answer on Stackoverflow
Solution 6 - JavaMeno HochschildView Answer on Stackoverflow
Solution 7 - JavaThermechView Answer on Stackoverflow
Solution 8 - JavaAlex SemeniukView Answer on Stackoverflow
Solution 9 - JavaMaxView Answer on Stackoverflow
Solution 10 - JavaLinhView Answer on Stackoverflow
Solution 11 - JavaGeorgeView Answer on Stackoverflow
Solution 12 - JavaextraneonView Answer on Stackoverflow
Solution 13 - JavamfruizsView Answer on Stackoverflow
Solution 14 - JavaUpendraView Answer on Stackoverflow
Solution 15 - JavaKrzysztof SzewczykView Answer on Stackoverflow
Solution 16 - JavaHardik DudhaiyaView Answer on Stackoverflow
Solution 17 - JavaLluis MartinezView Answer on Stackoverflow
Solution 18 - JavaSaurabh MishraView Answer on Stackoverflow
Solution 19 - JavaThmHarshView Answer on Stackoverflow
Solution 20 - JavaGleidosnView Answer on Stackoverflow
Solution 21 - JavaankurdayalsinghView Answer on Stackoverflow
Solution 22 - JavaprachiView Answer on Stackoverflow