Question

I need the start date and the end date of the current month in Java. When the JSP page is loaded with the current month it should automatically calculate the start and end date of that month. It should be irrespective of the year and month. That is some month has 31 days or 30 days or 28 days. This should satisfy for a leap year too. Can you help me out with that?

For example if I select month May in a list box I need starting date that is 1 and end date that is 31.

Was it helpful?

Solution

There you go:

public Pair<Date, Date> getDateRange() {
    Date begining, end;

    {
        Calendar calendar = getCalendarForNow();
        calendar.set(Calendar.DAY_OF_MONTH,
                calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
        setTimeToBeginningOfDay(calendar);
        begining = calendar.getTime();
    }

    {
        Calendar calendar = getCalendarForNow();
        calendar.set(Calendar.DAY_OF_MONTH,
                calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        setTimeToEndofDay(calendar);
        end = calendar.getTime();
    }

    return Pair.of(begining, end);
}

private static Calendar getCalendarForNow() {
    Calendar calendar = GregorianCalendar.getInstance();
    calendar.setTime(new Date());
    return calendar;
}

private static void setTimeToBeginningOfDay(Calendar calendar) {
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
}

private static void setTimeToEndofDay(Calendar calendar) {
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
}

PS: Pair class is simply a pair of two values.

OTHER TIPS

If you have the option, you'd better avoid the horrid Java Date API, and use instead Jodatime. Here is an example:

LocalDate monthBegin = new LocalDate().withDayOfMonth(1);
LocalDate monthEnd = new LocalDate().plusMonths(1).withDayOfMonth(1).minusDays(1);

Try LocalDate from Java 8:

LocalDate today = LocalDate.now();
System.out.println("First day: " + today.withDayOfMonth(1));
System.out.println("Last day: " + today.withDayOfMonth(today.lengthOfMonth()));

With the date4j library :

dt.getStartOfMonth();
dt.getEndOfMonth();
Calendar c = Calendar.getInstance();
    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = 1;
    c.set(year, month, day);
    int numOfDaysInMonth = c.getActualMaximum(Calendar.DAY_OF_MONTH);
    System.out.println("First Day of month: " + c.getTime());
    c.add(Calendar.DAY_OF_MONTH, numOfDaysInMonth-1);
    System.out.println("Last Day of month: " + c.getTime());
Date begining, ending;
Calendar calendar_start =BusinessUnitUtility.getCalendarForNow();
  calendar_start.set(Calendar.DAY_OF_MONTH,calendar_start.getActualMinimum(Calendar.DAY_OF_MONTH));
  begining = calendar_start.getTime();
  String start= DateDifference.dateToString(begining,"dd-MMM-yyyy");//sdf.format(begining);


   //            for End Date of month
  Calendar calendar_end = BusinessUnitUtility.getCalendarForNow();
  calendar_end.set(Calendar.DAY_OF_MONTH,calendar_end.getActualMaximum(Calendar.DAY_OF_MONTH));
      ending = calendar_end.getTime();
      String end=DateDifference.dateToString(ending,"dd-MMM-yyyy");//or sdf.format(end);

enter code here



public static Calendar getCalendarForNow() {
        Calendar calendar = GregorianCalendar.getInstance();
        calendar.setTime(new Date());
        return calendar;
    }

Try this Code

Calendar calendar = Calendar.getInstance();
int yearpart = 2010;
int monthPart = 11;
int dateDay = 1;
calendar.set(yearpart, monthPart, dateDay);
int numOfDaysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("Number of Days: " + numOfDaysInMonth);
System.out.println("First Day of month: " + calendar.getTime());
calendar.add(Calendar.DAY_OF_MONTH, numOfDaysInMonth-1);
System.out.println("Last Day of month: " + calendar.getTime());

Hope it helps.

For Java 8+, below method will given current month first & last dates as LocalDate instances.

public static LocalDate getCurrentMonthFirstDate() {
    return LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).withDayOfMonth(1);
}

public static LocalDate getCurrentMonthLastDate() {
    return LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).plusMonths(1).withDayOfMonth(1).minusDays(1);
}

Side note: Using LocalDate.ofEpochDay(...) instead of LocalDate.now() gives much improved performance. Also, using the millis-in-a-day expression instead of the end value, which is 86400000 is performing better. I initially thought the latter would perform better than the the expression :P

public static void main(String[] args) 
    {
        LocalDate today = LocalDate.now();
        System.out.println("First day: " + 
today.withDayOfMonth(1));
        System.out.println("Last day: " + today.withDayOfMonth(today.lengthOfMonth()))
    }

Simple and Best, Try this One

Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.MONTH, 0);
            calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
            Date monthFirstDay = calendar.getTime();
            calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
            Date monthLastDay = calendar.getTime();

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String startDateStr = df.format(monthFirstDay);
        String endDateStr = df.format(monthLastDay);

        Log.e("DateFirstLast",startDateStr+" "+endDateStr);

Making it more modular, you can have one main function that calculates startDate or EndDate and than you can have individual methods to getMonthStartDate, getMonthEndDate and to getMonthStartEndDate. Use methods as per your requirement.

public static String getMonthStartEndDate(){
    String start = getMonthDate("START");
    String end = getMonthDate("END");
    String result = start + " to " + end;
    return result;
}

public static String getMonthStartDate(){
    String start = getMonthDate("START");
    return start;
}

public static String getMonthEndDate(){
    String end = getMonthDate("END");
    return end;
}

/**
 * @param filter 
 * START for start date of month e.g.  Nov 01, 2013
 * END for end date of month e.g.  Nov 30, 2013
 * @return
 */
public static String getMonthDate(String filter){
            String MMM_DD_COMMA_YYYY       = "MMM dd, yyyy";
    SimpleDateFormat sdf = new SimpleDateFormat(MMM_DD_COMMA_YYYY);
    sdf.setTimeZone(TimeZone.getTimeZone("PST"));
    sdf.format(GregorianCalendar.getInstance().getTime());

    Calendar cal =  GregorianCalendar.getInstance();
    int date = cal.getActualMinimum(Calendar.DATE);
    if("END".equalsIgnoreCase(filter)){
        date = cal.getActualMaximum(Calendar.DATE);
    }
    cal.set(Calendar.DATE, date);
    String result =  sdf.format(cal.getTime());
    System.out.println(" " + result  );

    return result;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top