2013-02-10 8 views
5

Die Java ME java.util.Calendar Klasse hat nicht die getActualMaximum() Methode:Java ME - wie Anzahl der Tage im Monat bekommen

... Diese Klasse Teilmenge für J2ME wurde auf der Basis der JDK 1.3 Kalender-Klasse. Viele Methoden und Variablen wurden gekürzt und andere Methoden vereinfacht, um die Größe dieser Klasse zu reduzieren.

Ist es sogar möglich, die Anzahl der Tage im Monat zu erhalten?

Antwort

2

Ich habe es mit der Antwort unten funktioniert. Aber danke Nate für ein funktionierendes Beispiel.

public static int getMaxDaysInMonth(int month, int year){ 
    Calendar cal=Calendar.getInstance(); 
    cal.set(Calendar.DATE, 1); 
    cal.set(Calendar.MONTH, month+1); 
    cal.set(Calendar.YEAR, year); 
    cal.set(Calendar.DATE, cal.get(Calendar.DATE)-1); 

    return cal.get(Calendar.DATE); 
} 

Es scheint der kürzeste zu sein und scheint auch gut zu funktionieren. Irgendwelche Kommentare?

-1

Verwenden Sie die getActualMaximum Methode auf Calendar

Gibt den Maximalwert, dass das angegebene Kalenderfeld konnte haben, den Zeitwert dieses Kalenders gegeben. Zum Beispiel ist der tatsächliche Höchstwert des MONTH-Felds 12 in einigen Jahren und 13 in anderen Jahren im hebräischen Kalendersystem.

Example from RoseIndia:

Calendar calendar = Calendar.getInstance(); 
int year = 2008; 
int month = Calendar.FEBRUARY; 
int date = 1; 
calendar.set(year, month, date); 
int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
System.out.println("Number of Days: " + days); 
+0

@Pma Irgendwelches Glück oder Fragen? –

+1

"getActualMaximum" -Methode ist von Java SE API-Dokumenten verwiesen ('http://docs.oracle.com/javase/1.5.0/docs/api/java/blah blah'). Java SE ist eine andere Plattform als Java Me und ME API ist sehr begrenzt im Vergleich zu SE – gnat

3

In J2ME, da Sie nicht über Calendar.getActualMaximum() verfügbar, könnten Sie so etwas wie die versuchen folgende: mit dem calculation from this answer, können Sie die Anzahl der Tage zwischen dem ersten Tag berechnen des Monats, an dem Sie interessiert sind, und der 1. Tag des nächsten Monats.

private int getDaysInMonth(int month, int year) { 
     Calendar cal = Calendar.getInstance(); // or pick another time zone if necessary 
     cal.set(Calendar.MONTH, month); 
     cal.set(Calendar.DAY_OF_MONTH, 1);  // 1st day of month 
     cal.set(Calendar.YEAR, year); 
     cal.set(Calendar.HOUR, 0); 
     cal.set(Calendar.MINUTE, 0); 
     Date startDate = cal.getTime(); 

     int nextMonth = (month == Calendar.DECEMBER) ? Calendar.JANUARY : month + 1; 
     cal.set(Calendar.MONTH, nextMonth); 
     if (month == Calendar.DECEMBER) { 
     cal.set(Calendar.YEAR, year + 1); 
     } 
     Date endDate = cal.getTime(); 

     // get the number of days by measuring the time between the first of this 
     // month, and the first of next month 
     return (int)((endDate.getTime() - startDate.getTime())/(24 * 60 * 60 * 1000)); 
    } 

Beachten Sie, dass diese Methode Monate als Calendar Konstanten nimmt, wie Calendar.JANUARY. Ich denke, die rohe Integer-Darstellung dieser ist 0-indiziert, wenn Sie also 12 für Dezember übergeben, können die Ergebnisse falsch sein. Ich habe auch keine Probleme mit der Sommerzeit getestet. Sie müssen also sicherstellen, dass dies für die Anforderungen Ihrer App ausreicht.

Über die obige Funktion wie folgt:

int d = getDaysInMonth(Calendar.DECEMBER, 2012); 
    d = getDaysInMonth(Calendar.FEBRUARY, 2012); 
    d = getDaysInMonth(Calendar.FEBRUARY, 2013); 

die Ausbeute wird d =

31 
29 
28 

(für US-Zeitzonen).

+0

Ich glaube, ich fand eine kürzere Version Ihrer Methode (siehe mein Update), aber es war die erste Antwort, die Java ME API verwendet. – Pma

+0

@Pma, ja, deine Antwort scheint sauberer zu sein. Ein Kommentar, obwohl. Es gibt einen logischen Fehler, der dir wahrscheinlich nicht wirklich wehtut. Wenn Sie beispielsweise nach der Anzahl der Tage im Dezember 2012 fragen, gibt es Ihnen die Anzahl der Tage im Dezember 2011. Das kann wahrscheinlich niemals scheitern, da Dezember kein Monat ist, der die Anzahl der Tage ändert ... I dachte nur, ich würde es erwähnen. Du kannst das als Optimierung betrachten :) – Nate