6

在这里我想显示日期

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

有人有想法可以帮助我吗?

4

5 回答 5

11

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

// 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);
}
于 2013-11-20T07:15:55.340 回答
5

现代答案:不要使用Calendar. 使用java.time现代 Java 日期和时间 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);

输出(缩写):

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

datesUntil给我们一个日期流,直到指定的结束日期Exclusive,所以当我们给它下个月的 1 号时,我们会得到该月的所有日期。在此示例中,截至 1 月 31 日(包括 1 月 31 日)。

链接: Oracle 教程:日期时间解释如何使用java.time.

于 2018-12-06T10:17:47.310 回答
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()));
    }

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

于 2013-11-20T07:48:25.087 回答
0

几条评论...

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

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

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

于 2013-11-20T07:22:33.103 回答
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):
于 2021-04-15T17:06:32.377 回答