Question

Here I want to display dates like

2013-01-01,
2013-01-02,
2013-01-03,
.
.
...etc

I can get total days in a month

private int getDaysInMonth(int month, int year) {
  Calendar cal = Calendar.getInstance();  // or pick another time zone if necessary
  cal.set(Calendar.MONTH, month);
  cal.set(Calendar.DAY_OF_MONTH, 1);      // 1st day of month
  cal.set(Calendar.YEAR, year);
  cal.set(Calendar.HOUR, 0);
  cal.set(Calendar.MINUTE, 0);
  Date startDate = cal.getTime();

  int nextMonth = (month == Calendar.DECEMBER) ? Calendar.JANUARY : month + 1;
  cal.set(Calendar.MONTH, nextMonth);
  if (month == Calendar.DECEMBER) {
     cal.set(Calendar.YEAR, year + 1);
  }
  Date endDate = cal.getTime();

  // get the number of days by measuring the time between the first of this
  //   month, and the first of next month
  return (int)((endDate.getTime() - startDate.getTime()) / (24 * 60 * 60 * 1000));
}

Does anyone have an idea to help me?

Was it helpful?

Solution

If you only want to get the max number of days in a month you can do the following.

// Set day to one, add 1 month and subtract a day
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DAY_OF_MONTH, 1); 
cal.add(Calendar.MONTH, 1);
cal.add(Calendar.DAY_OF_MONTH, -1);
return cal.get(Calendar.DAY_OF_MONTH);

If you actually want to print every day then you can just set the day of month to 1 and keep adding a day in a loop until the month changes.

Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DAY_OF_MONTH, 1); 
int myMonth=cal.get(Calendar.MONTH);

while (myMonth==cal.get(Calendar.MONTH)) {
  System.out.print(cal.getTime());
  cal.add(Calendar.DAY_OF_MONTH, 1);
}

OTHER TIPS

Modern answer: Don’t use Calendar. Use java.time, the modern Java date and time API.

YearMonth ym = YearMonth.of(2013, Month.JANUARY);
LocalDate firstOfMonth = ym.atDay(1);
LocalDate firstOfFollowingMonth = ym.plusMonths(1).atDay(1);
firstOfMonth.datesUntil(firstOfFollowingMonth).forEach(System.out::println);

Output (abbreviated):

2013-01-01
2013-01-02
2013-01-03
…
2013-01-30
2013-01-31

datesUntil gives us a stream of dates until the specified end date exclusive, so when we give it the 1st of the following month, we get exactly all the dates of the month in question. In this example case up to and including January 31.

Link: Oracle tutorial: Date Time explaining how to use java.time.

This will give you all days of a month.

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.MONTH, 1);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    System.out.print(df.format(cal.getTime()));
    for (int i = 1; i < maxDay; i++) {
        cal.set(Calendar.DAY_OF_MONTH, i + 1);
        System.out.print(", " + df.format(cal.getTime()));
    }

The first date is printed outside of loop for comma separated output.

A couple of comments...

Firstly, "... Calendar objects are particularly expensive to create." (J. Bloch, Effective Java, 2nd Ed.). If this is a method that you are going to be calling frequently, consider that you do not need to create a new Calendar object every time you call it.

Consider using a Calendar object held in a private static field that is initialized with a static initializer block. This presumes a single-threaded solution and would require synchronization in a concurrent environment. Otherwise, it really ought to be possible to reuse the same Calendar for your calculations.

Secondly, while you can find that greatest value for the DAY_OF_MONTH by iterating over the possible valid values, I think you can let the API do it for you. Consider using the getMaximum(DAY_OF_MONTH) or getGreatestMaximum(DAY_OF_MONTH) methods of the Calendar class.

Write a common method like that if you are using kotlin-

  fun getAllDateOfMonth(year: Int, month: Month): List<LocalDate> {
        val yearMonth= YearMonth.of(year, month)
        val firstDayOfTheMonth = yearMonth.atDay(1)
        val datesOfThisMonth = mutableListOf<LocalDate>()
        for (daysNo in 0 until yearMonth.lengthOfMonth()){
            datesOfThisMonth.add(firstDayOfTheMonth.plusDays(daysNo.toLong()))
        }
        return datesOfThisMonth
    }

And call it like that -

getAllDateOfMonth(2021,Month.MAY):
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top