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).
我能否以字母方式获取此信息? (当然,我不是指这首诗)
答案 0 :(得分:95)
如果你有一个代表月份值的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();
}
答案 1 :(得分: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个月”循环也不是一个有效的假设......)
为了获取该值,我选择了LocalDate
而不是DateTime
,以强调(无论多么微弱:)该值不依赖于时区。
请注意,这仍然不像看起来那么简单。我不知道如果使用一个年表构建LocalDate
会发生什么,但要求不同年代的字段的最大值。我对可能发生的事情有一些想法,知道一定数量的Joda Time,但这可能不是一个好主意:))
答案 2 :(得分:0)
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourMonth);
cal.set(Calendar.YEAR, yourYear);
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!
答案 3 :(得分:-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);
}