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

2022-08-31 17:14:28
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).

我可以按字谜方式获取此信息吗?(当然,我不是指那首诗)


答案 1

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

public static int daysOfMonth(int year, int month) {
  DateTime dateTime = new DateTime(year, month, 14, 12, 0, 0, 000);
  return dateTime.dayOfMonth().getMaximumValue();
}

答案 2

是的,虽然它并不像它可能的那样漂亮:

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个月”循环也不是一个有效的假设......)

我选择了a而不是a,以便获取值,强调(无论多么微弱:)该值不依赖于时区。LocalDateDateTime

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