Ok, I have a problem where: given two dates and a frequency, a list of dates are returned in that range based on that frequency.

The dates are formattedmm/dd/yyyywhere leading zeros are not included.

The frequency is formatted in one of 3 ways:

1)Daily- Occurs every day of week

2)X...- Occurs every day of week except the dates after the X

3)...- Occurs only on the days indicated

The days in the frequency are determined by a number, ranging 1 to 7 where 1 is Monday and 7 is Sunday. So, the frequencyX6would say: "Every day except Saturday" and the frequency126would say: "Only on Monday, Tuesday, and Saturday".

Now, to accomplish this task, I have a method that returns a List<Date>. Inside that method, I have a boolean array of 7 where each index is a day of the week (where Monday is index 0). I then set the booleans true/false based on the frequencies. After that, I compute each day in the range and check its Day Of Week to see if it is in the frequency. If it is, I add it to my List<Date>, if not, I exclude it. Here is my code for that method:

public List<Date> getDates(String star,String end,String frequency) { //Where frequencies[0] == Monday boolean[] frequencies = new boolean[7]; if(frequency.equalsIgnoreCase("Daily")) { for(int i=0;i<frequencies.length;i++) { frequencies[i]=true; } } else if(frequency.contains("X") || frequency.contains("x")) { for(int i=0;i<frequencies.length;i++) { frequencies[i] = true; } String n = frequency.substring(1); for(int i=0;i<n.length();i++) { int v = Integer.parseInt(n.substring(i,i+1)); frequencies[v-1] = false; } } else { for(int i=0;i<frequency.length();i++) { int v = Integer.parseInt(frequency.substring(i,i+1)); frequencies[v-1] = true; } } String[] eSplit = star.split("/"); String[] dSplit = end.split("/"); Date d1 = new Date(Integer.parseInt(eSplit[2]),Integer.parseInt(eSplit[0])-1,Integer.parseInt(eSplit[1])); Date d2 = new Date(Integer.parseInt(dSplit[2]),Integer.parseInt(dSplit[0])-1,Integer.parseInt(dSplit[1])); List<Date> dates = new ArrayList<Date>(); long interval = 1000 * 60 * 60 * 24; long endTime = d2.getTime(); long curTime = d1.getTime(); while (curTime <= endTime) { Date temp = new Date(curTime); Calendar check = new GregorianCalendar(temp.getYear(), temp.getMonth(), temp.getDate()); check.setFirstDayOfWeek(Calendar.MONDAY); int dayOfWeek = check.get(Calendar.DAY_OF_WEEK); if(frequencies[dayOfWeek-1]) dates.add(new Date(curTime)); curTime += interval; } return dates; }

The problem I am having is that the dates it returns are incorrect. Specifically, it would seem it is 1 day early and for some it doesn't even find dates. For example, for in restriction of:

1/4/2011 to 2/16/2011 for 6:

it returns:

1/7/2011

1/14/2011

1/21/2011

1/28/2011

2/4/2011

2/11/2011

while it should return:

1/8/2011

1/15/2011

1/22/2011

1/29/2011

2/5/2011

2/12/2011

Another example is that for the restriction of:

12/21/2010 to 1/3/2011 for 6:

it returns:

12/24/2010

12/31/2010

while it should return:

12/25/2010

1/1/2011

Any clues as to what is happening? I need to figure this out fairly quickly.