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

时间:2013-11-20 07:07:01

标签: java java.util.calendar

这里我想显示

之类的日期
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));
}

有没有人有想法帮助我?

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

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

第一个日期打印在循环外部,用于逗号分隔输出。

答案 2 :(得分:1)

现代答案:请勿使用Calendar。使用现代的Java日期和时间API java.time。

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

输出(缩写):

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

datesUntil为我们提供了一个日期流,直到指定的结束日期为排他为止,因此,当我们将其指定为下个月的第一天时,我们会得到该月中所有日期题。在此示例中,直到1月31日(含)。

链接: Oracle tutorial: Date Time解释了如何使用java.time

答案 3 :(得分:0)

几条评论......

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

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

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

答案 4 :(得分:0)

如果你使用 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
    }

然后这样称呼它-

getAllDateOfMonth(2021,Month.MAY):