Following is the code that I am using to calculate the week start date and end date for the given month. Assume week start day is MONDAY and week end day is SUNDAY. For exa
I get the answer with the following code
List<List<String>> getNumberOfWeeks(int year, int month) {
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
List<List<String>> weekdates = new ArrayList<List<String>>();
List<String> dates;
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, 1);
while (c.get(Calendar.MONTH) == month) {
dates = new ArrayList<String>();
while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
c.add(Calendar.DAY_OF_MONTH, -1);
}
dates.add(format.format(c.getTime()));
c.add(Calendar.DAY_OF_MONTH, 6);
dates.add(format.format(c.getTime()));
weekdates.add(dates);
c.add(Calendar.DAY_OF_MONTH, 1);
}
System.out.println(weekdates);
return weekdates;
}
A possible solution may be to not reinvent the wheel and use JodaTime or a similar library. For instance, you can use the dayOfWeek() function on a DateTime
to get the information you're after.
You are using terrible date-time classes that were supplanted years ago by the modern java.time classes defined in JSR 310. This work is much easier now.
YearMonth
The YearMonth class represents a specific month as a whole. Specify the month using the Month enum.
YearMonth ym = YearMonth.of( 2013 , Month.JANUARY ) ;
LocalDate
Get the first of the month.
LocalDate firstOfMonth = ym.atDay( 1 ) ;
TemporalAdjuster
Get the previous Monday, or stay with this date if it is a Monday.
TemporalAdjuster ta = TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) ;
LocalDate previousOrSameMonday = firstOfMonth.with( ta ) ;
Then loop a week at a time.
LocalDate endOfMonth = ym.atEndOfMonth() ;
LocalDate weekStart = previousOrSameMonday ;
do {
LocalDate weekStop = weekStart.plusDays( 6 ) ;
System.out.println( "Week: " + weekStart + " to " + weekStop ) ;
// Set up the next loop.
weekStart = weekStart.plusWeeks( 1 ) ;
} while ( ! weekStart.isAfter( endOfMonth ) ) ;
See this code run live at IdeOne.com.
Week: Monday, December 31, 2012 to Sunday, January 6, 2013
Week: Monday, January 7, 2013 to Sunday, January 13, 2013
Week: Monday, January 14, 2013 to Sunday, January 20, 2013
Week: Monday, January 21, 2013 to Sunday, January 27, 2013
Week: Monday, January 28, 2013 to Sunday, February 3, 2013
By the way, you might want to learn about, and consider using, the ISO 860 standard definition of a week. And then use the YearWeek class of the ThreeTen-Extra library.