如何在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).
我可以获取这些信息吗? (当然,我不是指这首诗)
如果你有一个DateTime
对象,表示一个月的值,那么它非常简单。 您从该DateTime
对象获取dayOfMonth
属性并获取该属性的最大值。 这是一个示例函数:
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年感兴趣。我已经明确地select了公历年表 – 在其他年代,您会得到不同的答案。 (而且“12个月”循环也不是有效的假设…)
我已经去了一个LocalDate
而不是一个DateTime
时间,以获取值,强调(不过愚蠢:)该值不依赖于时区。
这还不如看起来那么简单,介意你。 我不知道如果使用一个年代表来构buildLocalDate
,会发生什么事情,但要求在不同年代的某个领域的最大价值。 我对可能发生的事情有一些想法,知道一定量的约达时间,但这可能不是一个好主意:)
Calendar cal = Calendar.getInstance(); cal.set(Calendar.MONTH, yourMonth); cal.set(Calendar.YEAR, yourYear); cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!
这是另一个简单的function:
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); }