如何使用日历类获得一个月内的所有日期?

在这里,我希望显示日期

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

我可以在一个月内获得总天数

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

有没有人有想法帮助我?

如果您只想获得一个月内的最大天数,则可以执行以下操作。

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

如果您确实想要每天打印,那么您可以将月中的日期设置为1并继续在循环中添加一天,直到月份发生变化。

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

这将为您提供一个月的所有日子。

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

几条评论……

首先,“……日历对象的创建成本特别高。” (J. Bloch,Effective Java,2nd Ed。)。 如果这是您要经常调用的方法,请考虑每次调用它时都不需要创建新的Calendar对象。

考虑使用保存在私有静态字段中的Calendar对象,该静态字段使用静态初始化程序块进行初始化。 这假设是单线程解决方案,并且需要在并发环境中进行同步。 否则,它应该可以重复使用相同的日历进行计算。

其次,虽然您可以通过迭代可能的有效值找到DAY_OF_MONTH的最大值,但我认为您可以让API为您执行此操作。 考虑使用Calendar类的getMaximum(DAY_OF_MONTH)或getGreatestMaximum(DAY_OF_MONTH)方法。