2010-09-22 113 views

回答

85

如果你有一个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(); 
} 
+0

这不适合我。 getMaximumValue()在11月返回31,这当然是不正确的。 – 2013-11-18 20:02:45

+7

@ChrisGerken:也许你的月份是零索引的?对于JODA,月份应该是1-12的值。如果您在十一月份使用了10,那么JODA会将其视为10月并返回31. – 2013-12-26 19:18:11

+0

几乎所有与日期相关的错误都是因为JODA不是零索引。这很难记住! – 2015-10-20 03:17:18

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

这不是乔达泰。 OP明确要求这一点。 – BalusC 2010-09-22 19:46:00

+0

Oups。确切的...我专注于这个问题并忘记了标题......但是如果使用标准API可以轻松获得结果,那么像JodaTime这样的外部API是无用的。 – 2010-09-22 20:03:56

+5

我会亲自*离开java.util.Calendar。乔达时间是一个非常优秀的API。例如,如果您在getInstance返回9月31日时将它设置为2月,那么您将对此有多大信心?噢,别忘了2月是第1个月...... – 2010-09-22 20:20:53

3

是的,虽然它不是漂亮,因为它可能是:

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会发生什么情况,但要求在不同的年表中获得最大值。我有什么威力发生,寂寂约达时间一定量的一些想法,但它可能不是一个好主意:)

-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); 
} 
相关问题