How to get date of first Wednesday of a month java

2020-04-10 03:12发布

问题:

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.

回答1:

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


回答2:

This works

  • set start date
  • move to next month
  • move to first day in month
  • add days until we get to a wednesday

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


回答3:

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.



回答4:

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


回答5:

Or the Joda version:

private static DateTime nextFirstWednesday(DateTime dateTime) {
    while (dateTime.getDayOfMonth() > 7 || dateTime.getDayOfWeek() != DateTimeConstants.WEDNESDAY) {
        dateTime = dateTime.plusDays(1);
    }
    return dateTime;
}


回答6:

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


标签: java calendar