57
30 days hath September,
   April, June and November,
 All the rest have 31,
   Excepting February alone
(And that has 28 days clear,
   With 29 in each leap year).

我可以按字母顺序获取此信息吗?(当然,我不是指这首诗)

4

4 回答 4

102

如果您有一个DateTime代表月份值的对象,那么它非常简单。您dayOfMonth从该DateTime对象获取属性并获取该属性的最大值。这是一个示例函数:

public static int daysOfMonth(int year, int month) {
  DateTime dateTime = new DateTime(year, month, 14, 12, 0, 0, 000);
  return dateTime.dayOfMonth().getMaximumValue();
}
于 2010-09-22T19:51:49.667 回答
4

是的,虽然它没有想象中的那么漂亮:

import org.joda.time.*;
import org.joda.time.chrono.*;
import org.joda.time.field.*;

public class Test {
    public static void main(String[] args) {
        GregorianChronology calendar = GregorianChronology.getInstance();
        DateTimeField field = calendar.dayOfMonth();

        for (int i = 1; i < 12; i++) {
            LocalDate date = new LocalDate(2010, i, 1, calendar);
            System.out.println(field.getMaximumValue(date));
        }
    }
}

请注意,我已经硬编码了假设有 12 个月,并且我们对 2010 年感兴趣。不过,我已经明确选择了公历年表 - 当然,在其他年表中你会得到不同的答案。(而且“12 个月”循环也不是一个有效的假设......)

为了获取值,我选择了 aLocalDate而不是 a DateTime,以强调(尽管很微弱:)该值不依赖于时区。

请注意,这仍然不像看起来那么简单。我不知道如果使用一个年表来构造 会发生什么LocalDate,但要求不同年表中字段的最大值。我对可能发生的事情有一些想法,对 Joda Time 有一定的了解,但这可能不是一个好主意 :)

于 2010-09-22T19:52:31.280 回答
0
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourMonth);
cal.set(Calendar.YEAR, yourYear);
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!
于 2010-09-22T19:42:01.560 回答
-1

这是另一个简单的功能:

int daysOfMonth(DateTime dt) {
    int month = dt.getMonthOfYear();
    int month2 = month;
    int days = dt.getDay();
    DateTime dt2 = dt;
    while (month == month2 ) {
       days++;
       dt2.addDays(1);
       month2 = dt2.getMonthOfYear();
    }
    return (days - 1);
}
于 2011-11-21T17:52:41.657 回答