【问题标题】:How to get all the dates in a month using calender class?如何使用日历类获取一个月内的所有日期?
【发布时间】:2013-12-04 01:38:28
【问题描述】:

我想在这里显示日期

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

有人想帮我吗?

【问题讨论】:

  • 获得第一天,然后继续加 1?

标签: java java.util.calendar


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    现代答案:不要使用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 日时,我们会得到该月的所有日期。在此示例中,截止日期为 1 月 31 日(含)。

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

    【讨论】:

      【解决方案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()));
          }
      

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

      【讨论】:

      • 它可以工作,但int i 应该在循环中初始化为0,否则第一次打印将是该月的第二个日期;)
      • 第一个日期打印在循环之外,以逗号分隔输出。
      【解决方案4】:

      几个cmets...

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

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

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

      【讨论】:

        【解决方案5】:

        如果你用的是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):
        

        【讨论】:

          猜你喜欢
          • 2020-07-19
          • 1970-01-01
          • 1970-01-01
          • 2012-10-05
          • 2019-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多