How do I obtain the number of days within a given month using Joda-Time?

JavaDatetimeJodatime

Java Problem Overview


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)

Java Solutions


Solution 1 - Java

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 - Java

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 :)

Solution 3 - Java

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

Solution 4 - Java

Here is another simple 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);
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionManuel AraozView Question on Stackoverflow
Solution 1 - JavaErick RobertsonView Answer on Stackoverflow
Solution 2 - JavaJon SkeetView Answer on Stackoverflow
Solution 3 - JavaBenoit CourtineView Answer on Stackoverflow
Solution 4 - JavaDavid.Chu.caView Answer on Stackoverflow