How would I get the date of the next first Wednesday of the month using the java calendar class. For example:
Today(24/03/2012) the next first Wednesday will be 04/04/2012
On(05/04/2012) the next first Wednesday will be 02/05/2012
thanks.
How would I get the date of the next first Wednesday of the month using the java calendar class. For example:
Today(24/03/2012) the next first Wednesday will be 04/04/2012
On(05/04/2012) the next first Wednesday will be 02/05/2012
thanks.
In Java 8 and later, we can use the java.time classes including LocalDate
and TemporalAdjusters
, and the DayOfWeek
enum. See Tutorial.
LocalDate firstSundayOfNextMonth = LocalDate
.now()
.with( TemporalAdjusters.firstDayOfNextMonth() )
.with( TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY) );
This works
Code
import static java.util.Calendar.*;
public static void main(String[] args) {
System.out.println(getNextMonthFirstWed(new Date(112, 3 - 1, 24)));
System.out.println(getNextMonthFirstWed(new Date(112, 4 - 1, 05)));
}
private static Date getNextMonthFirstWed(Date date) {
Calendar c = getInstance();
c.setTime(date);
c.add(MONTH, 1);
c.set(DAY_OF_MONTH, 1);
// search until wednesday
while (c.get(DAY_OF_WEEK) != WEDNESDAY) {
c.add(DAY_OF_MONTH, 1);
}
return c.getTime();
}
Maybe this code is what you need:
Calendar calendar = Calendar.getInstance();
while (calendar.get(Calendar.DAY_OF_MONTH) > 7 ||
calendar.get(Calendar.DAY_OF_WEEK) != Calendar.WEDNESDAY) {
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
SimpleDateFormat gm = new SimpleDateFormat("MMM yyyy dd");
System.out.println(gm.format(new Date(calendar.getTimeInMillis())));
The output for today is: Apr 2012 04
.
For Apr 2012 04
the output is Apr 2012 04
.
For Apr 2012 05
the output is May 2012 02
.
This code will answer your question while providing a little more functionality. Using this, you can give a specific week day and it will return the first occurrence of the specified week day in the next month. This also avoids looping through and checking each day until you find the correct one. I converted this over from some groovy code that I am currently working with. Hope this helps!
private static Date getNextMonthFirstWeekDayOccurence(Date date, int weekDay) {
//Get Calendar and move it to the first day of the next month
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);
//Calculate the difference between the days of the week
int dayDifference = calendar.get(Calendar.DAY_OF_WEEK) - weekDay;
if (dayDifference < 0) { //Implies (calendar.get(Calendar.DAY_OF_WEEK) < weekDay)
calendar.add(Calendar.DAY_OF_MONTH, Math.abs(dayDifference));
} else if (dayDifference > 0) { //Implies (calendar.get(Calendar.DAY_OF_WEEK) > weekDay)
def daysToAdd = calendar.get(Calendar.DAY_OF_WEEK) - dayDifference;
calendar.add(Calendar.DAY_OF_MONTH, daysToAdd);
}
return calendar.getTime();
}
Or the Joda version:
private static DateTime nextFirstWednesday(DateTime dateTime) {
while (dateTime.getDayOfMonth() > 7 || dateTime.getDayOfWeek() != DateTimeConstants.WEDNESDAY) {
dateTime = dateTime.plusDays(1);
}
return dateTime;
}
public boolean firstWednesdayOfTheMonth() {
// gets todays date
Calendar calendar = Calendar.getInstance();
// get the date
int date = calendar.get(Calendar.DAY_OF_MONTH);
// get the day of the week SUNDAY == 1, MONDAY == 2 ....
int day = calendar.get(Calendar.DAY_OF_WEEK);
// this checks if its a wednesday and the date falls within 8 then it should be the first wednesday
if (date < 8 && day == 4) {
return true;
}
return false;
}