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

后端 未结 4 1229
离开以前
离开以前 2020-12-28 12:04
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).
<         


        
相关标签:
4条回答
  • 2020-12-28 12:08

    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);
    }
    
    0 讨论(0)
  • 2020-12-28 12:18
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.MONTH, yourMonth);
    cal.set(Calendar.YEAR, yourYear);
    cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!
    
    0 讨论(0)
  • 2020-12-28 12:19

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

    0 讨论(0)
  • 2020-12-28 12:30

    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();
    }
    
    0 讨论(0)
提交回复
热议问题