2010-09-22 22 views

risposta

85

Se si dispone di un oggetto DateTime che rappresenta un valore del mese, allora è abbastanza semplice. Si ottiene la proprietà dayOfMonth dall'oggetto DateTime e si ottiene il valore massimo della proprietà. Ecco una funzione di esempio:

public static int daysOfMonth(int year, int month) { 
    DateTime dateTime = new DateTime(year, month, 14, 12, 0, 0, 000); 
    return dateTime.dayOfMonth().getMaximumValue(); 
} 
+0

Questo non ha funzionato per me. getMaximumValue() restituisce 31 per novembre, che ovviamente non è corretto. –

+7

@ChrisGerken: Forse i tuoi mesi sono indicizzati a zero? Per JODA, il mese dovrebbe essere un valore compreso tra 1 e 12. Se hai usato 10 per novembre, JODA lo vedrebbe come ottobre e restituisce 31. –

+0

Quasi tutti i miei bug relativi alla data sono dovuti al fatto che JODA non è indicizzato a zero. È difficile da ricordare! –

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

Questo non è Jodatime. L'OP ha chiesto esplicitamente questo. – BalusC

+0

Oups. Esatto ... Mi sono concentrato sul problema e ho dimenticato il titolo ... Ma se il risultato può essere ottenuto facilmente con l'API standard, un'API esterna come JodaTime è inutile. –

+5

Personalmente starei * bene * lontano da java.util.Calendar. Joda Time è un'API di gran lunga superiore. Ad esempio, quanto sei sicuro di ciò che farà se lo imposti a febbraio quando 'getInstance' restituirà il 31 settembre? Oh, e non dimenticare che febbraio è il mese 1 ... –

3

Sì, anche se non è bella come potrebbe essere:

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)); 
     } 
    } 
} 

Si noti che ho hard-coded il presupposto che ci sono 12 mesi, e che siamo interessati al 2010. Io ho esplicitamente selezionare la cronologia gregoriana, tuttavia - in altre cronologie otterresti risposte diverse, naturalmente. (E il ciclo "12 mesi" non sarebbe un presupposto valido ...)

Sono andato per un LocalDate piuttosto che uno DateTime per recuperare il valore, per enfatizzare (comunque vagamente :) che il valore non dipende dal fuso orario.

Questo non è ancora così semplice come sembra, intendiamoci. Non so cosa succede se si utilizza una cronologia per costruire il LocalDate, ma si richiede il valore massimo di un campo in una cronologia diversa. Ho alcune idee su ciò che forza accadere, conoscendo una certa quantità su Joda tempo, ma non è probabilmente una buona idea :)

-1

Ecco un altro semplice funzione:

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); 
} 
Problemi correlati