How to get all the dates in a month using calender class?

蹲街弑〆低调 提交于 2019-12-22 08:41:16

问题


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?


回答1:


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



回答2:


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.




回答3:


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.




回答4:


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.



来源:https://stackoverflow.com/questions/20089549/how-to-get-all-the-dates-in-a-month-using-calender-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!