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).
我可以按字母顺序获取此信息吗?(当然,我不是指这首诗)
如果您有一个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();
}
是的,虽然它没有想象中的那么漂亮:
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 有一定的了解,但这可能不是一个好主意 :)
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourMonth);
cal.set(Calendar.YEAR, yourYear);
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!
这是另一个简单的功能:
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);
}