如何使用Joda-Time获取给定月份内的天数?

时间:2010-09-22 19:35:23

标签: java datetime jodatime

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 个答案:

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