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

问题描述 投票:54回答:4
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).

我能否以字母顺序获取此信息? (当然,我不是说这首诗)

java datetime jodatime
4个回答
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();
}

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,但这可能不是一个好主意:)


0
投票
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourMonth);
cal.set(Calendar.YEAR, yourYear);
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!

-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);
}
© www.soinside.com 2019 - 2024. All rights reserved.