2010-09-22 43 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); 
} 
相關問題