How do I obtain the number of days within a given month using Joda-Time?
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).
Can I obtain this info anagrammatically? (I don't mean the poem, of course)
Solution 1:
If you have a DateTime
object which represents a value in the month, then it's pretty straightforward. You get the dayOfMonth
property from that DateTime
object and get the maximum value of the property. Here is a sample function:
public static int daysOfMonth(int year, int month) {
DateTime dateTime = new DateTime(year, month, 14, 12, 0, 0, 000);
return dateTime.dayOfMonth().getMaximumValue();
}
Solution 2:
Yes, although it's not as pretty as it might be:
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));
}
}
}
Note that I've hard-coded the assumption that there are 12 months, and that we're interested in 2010. I've explicitly selected the Gregorian chronology though - in other chronologies you'd get different answers, of course. (And the "12 month" loop wouldn't be a valid assumption either...)
I've gone for a LocalDate
rather than a DateTime
in order to fetch the value, to emphasize (however faintly :) that the value doesn't depend on the time zone.
This is still not as simple as it looks, mind you. I don't know off-hand what happens if use one chronology to construct the LocalDate
, but ask for the maximum value of a field in a different chronology. I have some ideas about what might happen, knowing a certain amount about Joda Time, but it's probably not a good idea :)