Teil 1 Einführung
Kalenderdefinition:
öffentliches abstraktes Klassenkalender implementiert serialisierbare, klonbare, vergleichbare <kalender> {} Kalender kann als abstrakte Klasse angesehen werden.
Die Implementierung übernimmt die Werksmethode im Entwurfsmuster. Es manifestiert sich in: Wenn wir die Kalenderinstanz erhalten, gibt der Kalender das entsprechende Kalenderobjekt basierend auf den bestandenen Parametern zurück. Es gibt zwei Möglichkeiten, um eine Kalenderinstanz zu erhalten:
(1) Wenn wir den Kalender über Calendar.getInstance () erhalten, ist der Ausfall ein zurückgegebener Gregoriancalendar -Objekt.
Gregoriancalendar ist eine Implementierungsklasse von Kalender, die ein Standardkalendersystem bietet, das in den meisten Ländern der Welt verwendet wird.
(2) Wenn wir den Kalender über Calendar.getInstance (Timezone Timezone, Gebietsgebietsschema) oder Kalender erhalten.
Wenn es sich beispielsweise um Japan handelt, wird das japanisch -imperialcalendar -Objekt zurückgegeben.
Siehe den folgenden Code:
öffentlicher statischer Kalender getInstance () {// CreateCalendar () Create Calendar Calendar = CreateCalendar (TimeZone.getdefaultref (), locale.getdefault ()); cal.sharedzone = true; Return Cal;} öffentlicher statischer Kalender GetInstance (TimeZone Zone) {// CreateCalendar () Calender Return CreateCalendar (Zone, Locale.getDefault ());} öffentliche statische statische Kalender -Getinstance (Lokale Alocale) {// Creecalendar () Calendar = Calendar = Creecalendar (Timendar (Timendar). Alocale); cal.sharedzone = true; return cal;} öffentlicher statischer Kalender GetInstance (TimeZone Zone, Lokale Alocale) {// CreateCalendar () Calender Return CreateCalendar (Zone, Alocale) erstellen. ist "jp", es gibt das japanisch -ImperialCalendar -Objekt zurück, wenn ("th" (alocale.getLanguage ()) && ("th" .Eequals (alocale.getCountry ()))) {return New Sun.util.buddhistcalendar (Zone, Alocale); } else if ("jp" .equals (alocale.getvariant ()) && "jp" .equals (alocale.getCountry ())) && "ja" .equals (alocale.getLanguage ())) {neuer japanisch -alcalendar (zone, alocale); } // (03) Gibt das Gregoriancalendar -Objekt zurück. Return New Gregoriancalendar (Zone, Alocale); }Nachdem wir die Kalenderinstanz erhalten haben, können wir den Kalender durch einige vom Kalender bereitgestellte Spaltenmethoden manipulieren.
Teil 2 Prinzipien und Gedanken des Kalenders
Wenn wir den Kalender verwenden, sind wir nichts weiter als die Felder des Kalenders "Jahr, Monat, Tag, Woche, Stunde, Minute und zweite" zu betreiben. Im Folgenden lernen wir die Quell-, Definitions- und Berechnungsmethoden dieser Felder.
1. Kalender die Quelle jedes Feldwerts
Wenn wir Kalender verwenden, verwenden wir einfach Informationen wie "Jahr, Monat, Tag, Woche, Stunde, Minute und zweite". Wie hat es das gemacht? Im Wesentlichen spart der Kalender eine Zeit. Die folgende Definition:
// Zeit ist die aktuelle Zeit in Millisekunden. // Es ist der Unterschied zwischen der aktuellen Zeitstrecke "1. Januar 1970, 0:00:00 GMT". lange Zeit geschützt;
Kalender berechnet Informationen wie "Kalenderjahr, Monat, Tag, Woche, Stunde, Minute, zweiter" basierend auf der Zeit.
2. Definition und Initialisierung jedes Kalenderfelds
Die Informationen des Kalenders "Jahr, Monat, Tag, Woche, Stunde, Minute und zweiter" haben insgesamt 17 Felder.
Wir verwenden Kalender, was nichts anderes ist als diese 17 Felder. Ihre Definitionen sind wie folgt:
(Feld 0) Öffentliche endgültige statische Int -Ära = 0;
Beschreibung: Ära.
Wert: Kann nur 0 oder 1 sein.
(Feld 1) öffentliches endgültiges statisches Int -Jahr = 1;
Beschreibung: Jahr.
(Feld 2) öffentliches endgültiges statisches int Monat = 2;
Beschreibung: Monatlicher Wert: Kann Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember, Undecimber sein.
Der erste Monat davon ist Januar, der 0 ist.
(Feld 3) öffentliches endgültiges statisches int week_of_year = 3;
Hinweis: Das aktuelle Datum entspricht der Jahreswoche. Der Wert für die erste Woche des Jahres beträgt 1.
(Feld 4) öffentliches endgültiges statisches int week_of_month = 4;
Hinweis: Das aktuelle Datum entspricht der Woche des Monats. Der Wert für die erste Woche eines Monats beträgt 1.
(Feld 5) öffentliches endgültiges statisches Int -Datum = 5;
Beschreibung: Tag. Der Wert für den ersten Tag eines Monats beträgt 1.
(Feld 5) öffentliches endgültiges statisches Int Day_of_month = 5;
Hinweis: Wie "Datum" bedeutet "Tag".
(Feld 6) öffentliches endgültiges statisches Int Day_of_year = 6;
Hinweis: An welchem Tag entspricht das aktuelle Datum diesem Jahr? Der Wert für den ersten Tag des Jahres beträgt 1.
(Feld 7) Public Final Static int Day_of_week = 7;
Beschreibung: Welcher Wochentag.
Werte: Kann Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag und Samstag sein.
Unter ihnen ist der Sonntag 1, Montag 2 und so weiter.
(Feld 8) Öffentliche endgültige statische Int Day_of_week_in_month = 8;
Beschreibung: Welche Woche des aktuellen Monats.
Werte: Day_of_month 1 bis 7 entsprechen immer DAY_OF_WEEK_IN_MONTH 1; 8 bis 14 entsprechen immer DAY_OF_WEEK_IN_MONTH 2 usw.
(Feld 9) Öffentliche endgültige statische int am_pm = 9;
Beschreibung: Morgen- oder Nachmittagswert: Kann Am oder PM sein. AM ist 0, was den Morgen anzeigt; PM ist 1, was am Nachmittag hinweist.
(Feld 10) Öffentliche endgültige statische Int -Stunde = 10;
Beschreibung: Zeigt die Tagesstunde an.
Die Stunde wird für 12 -Stunden -Uhren verwendet (0 - 11). Mittag und Mitternacht werden durch 0 dargestellt, nicht 12.
(Feld 11) öffentliches endgültiges statisches int hour_of_day = 11;
Beschreibung: Zeigt die Tagesstunde an.
Hour_of_day wird für die 24-Stunden-Uhr verwendet. Zum Beispiel ist Hour_of_day im Moment von 10: 04: 15.250 PM 22.
(Feld 12) öffentliches endgültiges statisches int Minute = 12;
Beschreibung: Welche Minute einer Stunde?
Zum Beispiel ist die Minute im Moment von 10: 04: 15.250 PM 4.
(Feld 13) öffentliches endgültiges statisches int zweiter = 13;
Beschreibung: Was für eine Sekunde in einer Minute.
Zum Beispiel ist der zweite im Moment von 10: 04: 15.250 PM 15.
(Feld 14) Public Final Static int Millisekunden = 14;
Beschreibung: Welche Millisekunden einer Sekunde.
Zum Beispiel beträgt Millisekunde im Moment von 10: 14: 15.250 Uhr 250.
(Feld 15) öffentliches endgültiges statisches int zone_offset = 15;
Hinweis: Millisekunden geben den ungefähren Versatz von GMT an.
(Feld 16) öffentliches endgültiges statisches int dst_offset = 16;
Beschreibung: Millisekunden geben den Offset von Tageslichtsparzeit an.
Public Final static int field_count = 17;
Diese 17 Felder werden im INT -Array gespeichert. Die Definition ist wie folgt:
// Speichern Sie das Array dieser 17 Felder geschützten Int -Felder []; // Die Array -Definition -Funktion geschützte Kalender (TimeZone Zone, Lokale alocale) {// Fields Array "fields = new int [field_count]; isset = new boolean [field_count]; stempel = new int [field_count]; this.zone = Zone; setweekCountData (Alocale);}Geschützter Kalender (Timezone Zone, Lace -Alocale) Dies ist der Konstruktor des Kalenders. Es wird von seinem Konstruktor der Unterklasse aufgerufen, wodurch ein neues Array von "17 Felddaten des Kalenders speichern" erstellt wird.
3. Kalender Kalender Die Berechnung jedes Feldwerts
Nehmen wir Get (int Feld) als Beispiel, um kurz die Berechnung und den Betrieb der 17 Felder von Kalender zu erklären. Get (int Feld) soll den Wert des Feldes "Feld" erhalten. Seine Definition ist wie folgt:
public int get (int field) {// Berechnen Sie die Werte jedes Feldes vollständig (); // Rückgabe des Wertes des Feldfelds Return Internalget (Feld);} Hinweis: Der Code von GET (int Feld) ist sehr einfach. Berechnen Sie zunächst die Werte jedes Feldes durch complete () und geben dann "den Wert des Feldfelds" über Internalget (Feld) zurück.
Die Funktion von complete () besteht darin, die Werte jedes Kalenderfelds zu berechnen. Es ist in Calendar.java definiert. Der Code ist wie folgt:
Protected void complete () {if (! Istimeset) updatetime (); if (! arefieldsSet ||! areAllfieldsSet) {computeFields (); // füllt nicht festgelegte Felder areAllfieldsSet = areFieldsSet = true; }} private void updateTime () {computerTime (); istimeSet = true;} updatetime () Die computerTime () genannt wird in der Implementierungsklasse von Calendar.java definiert. Im Folgenden liste ich die Implementierung von computerTime () in Gregoriancalendar.java auf: Protected void computerTime () {// Im nicht lenientierten Modus führen Sie eine kurze Überprüfung von Kalender durch // Felder, die extern festgelegt wurden. Durch diese // Überprüfung werden die Feldwerte in Originalfields [] // gespeichert, ob eine davon später normalisiert wird. if (! islenient ()) {if (originalfields == null) {originalfields = new int [field_count]; } für (int field = 0; field <field_count; field ++) {int value = interalget (field); if (isexternalSet (field)) {// Schnelle Validierung für irgendwelche außerhalb der Bereichswerte if (value <getMinimum (Feld) || Wert> getMaximum (Feld)) {neue illegalArgumentException (getFieldName (Feld) werfen); }} originalfields [field] = Wert; }} // Lassen Sie die Superklasse feststellen, welche Kalenderfelder // verwendet werden sollen, um die Zeit zu berechnen. int fieldmask = selectFields (); // Das Jahr stellt den Start des Epochs aus. Wir überprüfen // Fieldmask nicht für ein Jahr, da das Jahr ein obligatorisches Feld ist, um das Datum zu bestimmen. Int Year = Isset (Jahr)? Internalget (Jahr): epoch_year; int era = internetgetera (); if (era == bce) {Jahr = 1 - Jahr; } else if (era! // (dieselbe Normalisierungsregel wie add ()/rol () könnte hier im Nachdruckmodus angewendet werden. Diese Überprüfung wird jedoch für die Kompatibilität ab 1,5 unverändert gehalten. } // Wenn das Jahr 0 oder negativ ist, müssen wir den ERA -Wert später festlegen. if (Jahr <= 0 &&! isSet (era)) {fieldmask | = era_mask; setFields computed (ERA_Mask); } // Berechnen Sie die Tageszeit. Wir verlassen uns auf die Konvention, dass // ein nicht eingestelltes Feld 0. Langzeitday = 0 hat; if (isfieldset (fieldmask, hour_of_day)) {timeofday += (long) interalget (Hour_of_day); } else {timeOfday += internget (stunde); // Der Standardwert von AM_PM beträgt 0, was AM bezeichnet. if (isfieldset (fieldmask, am_pm)) {timeOfday += 12 * internet (am_pm); }} timeOfday *= 60; timeofday += internget (Minute); Zeitofday *= 60; timeOfday += internget (zweite); Zeitofday *= 1000; timeofday += internget (Millisekunden); // Die Tageszeit in die Anzahl der Tage und den Offset von // Millisekunden von Mitternacht umwandeln. Long FixedDate = TimeOfday / One_day; timeofday %= One_day; while (timeofday <0) {timeOfday += One_day; -fixeddate; } // Berechnen Sie das feste Datum seit dem 1. Januar 1 (Gregorianer). CalculateFixedDate: {Long GFD, JFD; if (Jahr> Gregoriancuteoear && Jahr> Gregoriancutearjulian) {Gfd = FixedDate + getFixedDate (GCAL, Jahr, FieldMask); if (gfd> = gregoriancutoverdate) {fixedDate = gfd; break calculedFixedDate; } jfd = fixedDate + getFixedDate (getJuliancalendarSystem (), Jahr, FieldMask); } else if (Jahr <gregoriancuteoveryear && Jahr <gregoriancutearjulian) {jfd = fixedDate + getFixedDate (getJuliancalendarSystem (), Jahr, Fieldmask); if (jfd <gregoriancutoverdate) {FixedDate = jfd; break calculedFixedDate; } gfd = fixedDate + getFixedDate (GCAL, Jahr, FieldMask); } else {gfd = fixedDate + getFixedDate (GCAL, Jahr, FieldMask); JFD = FixedDate + getFixedDate (getJuliancalendarSystem (), Jahr, FieldMask); } // Jetzt müssen wir bestimmen, welches Kalenderdatum es ist. if (gfd> = gregoriancutoverdate) {if (jfd> = gregoriancutoverdate) {fixedDate = gfd; } else {// Das Datum befindet sich in einem "überlappenden" Zeitraum. Auf keinen Fall // es zu zerstören. Bestimmen Sie es mit der Berechnung der vorherigen Datum. if (calsys == gcal || calsys == null) {fixedDate = gfd; } else {fixedDate = jfd; }}} else {if (jfd <gregoriancutoverdate) {fixedDate = jfd; } else {// Das Datum befindet sich in einer "fehlenden" Zeit. if (! islenient ()) {werfen Sie neue illegalArgumentException ("Das angegebene Datum existiert nicht"); } // Nehmen Sie das Julian -Datum für die Kompatibilität, die // ein Gregoriantermin erzeugt. fixedDate = jfd; }}} // Millis repräsentiert die lokale Wand-Clock-Zeit in Millisekunden. long Millis = (fixedDate - epoch_offset) * One_day + timeOfday; // Berechnen Sie den Zeitzonenversatz und den DST -Offset. Hier gibt es zwei Potenzial // Ambiguitäten. Wir nehmen hier eine Umstellungszeit von 2:00 Uhr (Wandzeit) für Diskussionszwecke. // 1. Der Übergang in DST. Hier kann eine entworfene Zeit von 2:00 - 2:59 Uhr // je nach DST im Standard oder in DST sein. 2:00 Uhr ist jedoch eine ungültige // Darstellung (die Darstellung springt von 1:59:59 bis 3:00:00 Uhr DST). // Wir nehmen die Standardzeit an. // 2. Der Übergang von DST. Hier kann eine entworfene Zeit von 1:00 bis 1:59 Uhr // Standard oder DST sein. Beide sind gültige Darstellungen (der Repräsentant // springt von 1:59:59 DST bis 1:00:00 STD). // Wir nehmen wieder die Standardzeit an. // Wir verwenden das TimeZone -Objekt, es sei denn, der Benutzer hat die Felder zone_offset // oder dst_offset explizit festgelegt. Dann verwenden wir diese Felder. TimeZone Zone = Getzone (); if (zoneOffsets == null) {zoneOffsets = new int [2]; } int tzmask = fieldmask & (zone_offset_mask | dst_offset_mask); if (Tzmask! } else {int gmtoffset = isFieldset (fieldmask, zone_offset)? Internalget (Zone_Offset): Zone.getRawoffset (); Zone.GetOffsets (Millis - GMTOFFSET, ZoneOffsets); }} if (tzmask! } if (isFieldset (Tzmask, dst_offset)) {zoneOffsets [1] = internget (dst_offset); }} // Passen Sie die Zeitzonenversetztwerte an, um die UTC -Zeit zu erhalten. Millis -= ZoneOffsets [0] + ZoneOffsets [1]; // Setzen Sie die Zeit dieses Kalenders in Millisekunden Time = Millis; int mask = computefields (fieldmask | getSetSetStateFields (), Tzmask); if (! islenient ()) {für (int field = 0; field <field_count; field ++) {if (! isexternalSet (field)) {Fortsetzung; } if (originalfields [field]! neue IllegalArgumentException (GetfieldName (Feld)) werfen; }}} setfieldsnormalisierte (Maske);};} Schauen wir uns als nächstes die Definition von Internalget (Feld) an. wie folgt:
geschütztes endgültiges Int Internalget (int field) {return fields [field];} Daraus können wir sehen, dass GET (int Feld) letztendlich den Wert über Internalget (int Feld) zurückgibt.
Internalget (int Feld) gibt das Feldelement tatsächlich im Feld Array zurück. Dies entspricht den 17 Elementen des Kalenders!
Kurz gesagt, wir müssen verstehen: Kalender berechnet "Jahr, Monat, Tag, Stunde, Minute, zweiter" und so auf der Grundlage einer Zeit (Millisekunden), um unsere Geschäftstätigkeit in "Jahr, Monat, Tag, Stunde, Minute, Sekunde" und so weiter zu erleichtern. Im Folgenden stellen wir die relevanten Betriebsfunktionen vor, die im Folgenden von Kalender bereitgestellt werden.
Teil 3 Kalenderfunktion Oberfläche
1. Gemeinsame Grenzfläche von 17 Kalenderfeldern
Diese 17 Bereiche des Kalenders unterstützen die folgende öffentliche Funktionschnittstelle. Beispiele für die Verwendung dieser gängigen Schnittstellen finden Sie in der Funktion testAllCalendarsets () im Calendartest.java -Beispiel.
(1) GetMaximum (int Feld)
Funktion: Holen Sie sich den "Maximalwert des Feldes". HINWEIS "Vergleichen Sie den Unterschied zwischen IT und getactualMaximum ()". Beispiel: In Bezug auf das Feld "Monat". Wie man es benutzt, ist:
// Kalenderinstanz Kalender Cal = Calendar.getInstance (); // den Höchstwert des Monats int max = cal.getMaximum (Calendar.mont) erhalten;
Um den maximalen Wert anderer Felder zu erhalten, müssen Sie den entsprechenden Monat im Beispiel nur durch andere Feldnamen ersetzen.
(2) getactualMaximum (int Feld)
Funktion: Erhalten Sie den "Maximalwert dieses Feldes unter dem aktuellen Datum". Beispiel: In Bezug auf das Feld "Monat". Wie man es benutzt, ist:
// Kalenderinstanz Kalender cal = calendar.getInstance (); // den Höchstwert des aktuellen Monat int max = cal.getactualMaximum (Calendar.month) erhalten;
Um den maximalen Wert anderer Felder zu erhalten, müssen Sie den entsprechenden Monat im Beispiel nur durch andere Feldnamen ersetzen.
Hinweis: Vergleichen Sie den Unterschied zwischen getactualMaximum () und GetMaximum (). Siehe das folgende Vergleichsbeispiel,
A. Der von getMaximum () erhaltene "Feldmaximalwert" bezieht sich auf den in allen zusammengesetzten Daten erhaltenen "Feldmaximalwert".
Zum Beispiel besteht der Zweck von GetMaximum (Kalender.Date) darin, "das maximale Tag zu bekommen". Basierend auf allen Daten werden maximal 31 Tage pro Monat erhalten. Daher beträgt der Rückgabewert von GetMaximum (Kalender.Date) "31"!
B. GetActualMaximum () erhält den "Maximalwert dieses Feldes zum aktuellen Datum".
Wenn das Datum beispielsweise 2013-09-01 ist, soll GetactualMaximum (Kalender.date) "maximal Tag" erhalten und "30" ist. Der aktuelle Datum ist September und September beträgt nur 30 Tage. Daher beträgt der Rückgabewert von getactualMaximum (Kalender.Date) "30"!
(3) GetMinimum (int Feld)
Funktion: Holen Sie sich den "Mindestwert des Feldes". HINWEIS "Vergleichen Sie den Unterschied zwischen ihm und Getactualminimum ()". Beispiel: In Bezug auf das Feld "Monat". Wie man es benutzt, ist:
// Kalenderinstanz Kalender cal = calendar.getInstance (); // den Mindestwert des Monats int min = cal.getminimum (Calendar.month) erhalten;
Um den Mindestwert anderer Felder zu erhalten, müssen Sie den entsprechenden Monat im Beispiel nur durch andere Feldnamen ersetzen.
(4) getactualminimum (int Feld)
Funktion: Erhalten Sie den "Mindestwert dieses Feldes unter dem aktuellen Datum". Beispiel: In Bezug auf das Feld "Monat". Verwenden Sie Methode: // Kalenderinstanz Kalender Cal = Calendar.getInstance (); // den Mindestwert des Monats int min = cal.getminimum (Calendar.month) erhalten;
Um den Mindestwert anderer Felder zu erhalten, müssen Sie den entsprechenden Monat im Beispiel nur durch andere Feldnamen ersetzen.
Hinweis: Im Standardkalender von Java haben GetMinimum () und Getactualminimum () unterschiedliche Bedeutungen; Ihre Rückgabewerte sind jedoch gleich. Da der Verzug des Kalenders darin besteht, das Gregoriancalendar -Objekt zurückzugeben, in Gregoriancalendar.java, GetMinimum () und Getactualminimum () denselben Wert zurückgeben.
(5) Get (int Feld)
Funktion: Holen Sie sich den "aktuellen Wert des Feldes". Ruft den aktuellen Wert des Feldfelds ab. Beispiel: In Bezug auf das Feld "Monat". Die Methode "den aktuellen Wert des Monats erhalten" lautet:
// Kalenderinstanz Kalender cal = calendar.getInstance (); // den aktuellen Monat des Monats von "Cal Calendar" int Month = Cal.get (Calendar.month) erhalten;
Um den aktuellen Wert anderer Felder zu erhalten, müssen Sie den entsprechenden Monat im Beispiel nur durch andere Feldnamen ersetzen.
(6) set (int Feld, int Wert)
Funktion: Setzen Sie den "aktuellen Wert des Feldes". Legen Sie den aktuellen Wert des Feldfelds auf Wert ein Beispiel ein: In Bezug auf das Feld "Monat". Die Methode "Festlegen des aktuellen Wertes des Monats" lautet:
// Kalenderinstanz Kalender Cal = Calendar.getInstance (); // Legen Sie den aktuellen Monat des "Kalenders" auf 1988 Cal.set (Calendar.month, 1988) fest;
veranschaulichen:
A. 1988 ist der aktuelle Wert des Monats, den Sie festlegen möchten. Dieser Einstellwert muss eine Ganzzahl sein.
B. Um den aktuellen Wert anderer Felder festzulegen, müssen Sie den entsprechenden Monat im Beispiel nur durch andere Feldnamen ersetzen.
(7) add (int field, intwert)
Funktion: Fügen Sie dem "aktuellen Wert des Feldes" einen Wert hinzu. Fügen Sie dem aktuellen Wert des Feldfelds einen Wert hinzu. Beispiel: In Bezug auf das Feld "Monat". Die Methode lautet wie folgt:
// Kalenderinstanz erhalten und das Datum auf "2013-09-01" Calendar Cal = Calendar.getInstance (); Cal.Set (Calendar.year, 2013) festlegen;
veranschaulichen:
A. -10 ist der Mehrwert.
Der Mehrwert kann eine positive oder negative Zahl sein.
Eine positive Zahl zeigt an, dass das Datum erhöht wird, und eine negative Zahl zeigt an, dass das Datum verringert wird.
Annahme: Jetzt ist der Wert von CAL "2013-09-01", jetzt erhöhen wir den Monatsfeldwert -10. Das Ergebnis ist: "2012-10-01".
Warum passiert das? "2013-09-01" erhöht sich um -10, was bedeutet, dass das Datum um 10 Monate reduziert wird. Das Ergebnis ist "2012-10-01".
B. Unter den 17 Kalenderfeldern: Mit Ausnahme des Rolling Calendars.zone_Offset wird eine illegalArgumentException -Ausnahme ausgelöst. Andere Felder unterstützen diesen Vorgang.
C. Um den aktuellen Wert anderer Felder festzulegen, müssen Sie den entsprechenden Monat im Beispiel nur durch andere Feldnamen ersetzen.
(8) Roll (int Feld, int Wert)
Funktion: Rollen Sie das Beispiel "Aktueller Wert des Feldes" zurück: Nehmen Sie das Feld "Monat". Die Methode "Zurückrollen des aktuellen Wertes des Monats" lautet:
// Kalenderinstanz erhalten und das Datum auf "2013-09-01" Calendar Cal = Calendar.getInstance (); Cal.Set (Calendar.year, 2013) festlegen;
veranschaulichen:
A. -10 ist der Rollback -Wert.
Wenn der Rollback -Wert eine negative Zahl ist, bedeutet dies, das aktuelle Feld vorwärts zu rollen.
Wenn der Rollback -Wert eine positive Zahl ist, bedeutet dies, das aktuelle Feld rückwärts zu rollen.
Wenn Sie ein Feld im Kalender zurückrollen, ändern Sie das größere Feld nicht!
Dies ist der Basisunterschied zwischen Roll () und add ()! add () kann größere Felder ändern, z. B. "add (), um das Feld" Monats "zu ändern, kann eine Änderung im Feld" Jahr "verursachen. Aber Roll () ändert keine größeren Felder, wie z. B. "Verwendung von Roll (), um das Feld" Monat "zu ändern, es wird keine Änderung im Feld" Jahr "verursachen."
Annahme: Jetzt ist der Wert von CAL "2013-09-01", jetzt erhöhen wir den Monatsfeldwert -10. Das Ergebnis ist: "2013-10-01".
Warum passiert das? Dies liegt daran, dass "Rollback" "zwischen dem Minimum und dem Maximum hin und her rollen" bedeutet. In diesem Beispiel ist der Monat September, und der vorherige Rollback beträgt 10, und der erhaltene Wert ist Oktober, aber Roll () wird das Feld "größer als Monat" nicht ändern, sodass sich das Jahr des Jahres nicht ändert. Das Ergebnis ist also "2013-10-01".
B. Unter den 17 Kalenderfeldern: Mit Ausnahme des Rolling Calendars.zone_Offset wird eine illegalArgumentException -Ausnahme ausgelöst. Andere Felder unterstützen diesen Vorgang.
C. Um den aktuellen Wert anderer Felder festzulegen, müssen Sie den entsprechenden Monat im Beispiel nur durch andere Feldnamen ersetzen.
(9) klar (int Feld)
Funktion: Löschen Sie den "aktuellen Wert des Feldes". Die sogenannte Lichtung legt tatsächlich den Wert von "Feld" auf 0 fest; Wenn der Mindestwert des Feldes 1 beträgt, ist er auf 1. Beispiel: In Bezug auf das Feld "Monat". Die Methode des "klaren Monat" lautet:
// Kalenderinstanz erhalten und das Datum auf "September" Kalender Cal = Calendar.getInstance (); Cal.set (Calendar. Month, 9); // Clear MonthCal.Clear (Calendar.month) festlegen;
Um andere Felder zu löschen, müssen Sie den entsprechenden Monat im Beispiel nur durch andere Feldnamen ersetzen.
(10) ISSET (INT -Feld)
Funktion: Bestimmen Sie, ob das Feld "Feld" festgelegt ist. Wenn Clear () aufgerufen wird, wird das Feld "kein fester Zustand". Beispiel: In Bezug auf das Feld "Monat". Die Methode "zu beurteilen, ob der Monat festgelegt ist" ist:
// Kalenderinstanz Calendar Cal = Calendar.getInstance (); // Bestimmen Sie, ob der Monat boolean bset = cal.isset (Calendar.month) festgelegt ist;
Um andere Felder zu bestimmen, müssen Sie den entsprechenden Monat im Beispiel nur durch andere Feldnamen ersetzen.
2. Andere Funktionen des Kalenders
(1) Datumsvergleichsfunktion
Die Vergleichsfunktion des Kalenders enthält hauptsächlich Folgendes:
// Vergleichen Sie, ob Datum, Zeitzone und andere Inhalte des "aktuellen Kalenderobjekts" und "Kalender" gleich sind. Boolean Equals (Objektobjekt) // Ob das aktuelle Kalenderobjekt früher als Calendarboolean vor (Objektkalender) ist (Objektkalender) // Ob das aktuelle Kalenderobjekt später als Kalender nach (Objektkalender) ist (Objektkalender) // das aktuelle Kalenderobjekt "und" Kalender "vergleichen. // Wenn früher als "Kalender", kehren Sie -1 // zurück, wenn Sie gleich sind, 0 //, wenn später als "Kalender", return 1Int im Vergleich zu (Kalender AnotherCalendar).
Beispiele für die Verwendung dieser Funktionen finden Sie in der Funktion testComparatorapis () im Beispiel calendartest.java.
Beispiel: Angenommen, Cal1 und Cal2 sind beide zwei Kalenderobjekte.
// ihre Verwendungsmethoden sind wie folgt boolean isequal = cal1.equals (cal2); boolean isbefore = cal1.before (Cal2); boolean isafter = cal1.after (cal2); int icompare = cal1.comPareto (Cal2);
(2) "Toleranz" -Funktion
// Setzen Sie "Kalendertoleranz" void setLenient (boolescher Wert) // Get "Kalendertoleranz" boolean islenient ()
Beispiele für die Verwendung dieser Funktionen finden Sie in der Funktion testlenientapis () im Beispiel calendartest.java.
veranschaulichen:
Der Kalender verfügt über zwei Modi, die Kalenderfelder interpretieren, nämlich milde und nicht unbedingt.
A. Wenn sich der Kalender im Nachdruckmodus befindet, kann er Werte innerhalb eines größeren Bereichs als der Bereich der von ihm generierten Kalenderfelder akzeptieren. Wenn der Kalender die Kalenderfeldwerte neu berechnet, sodass diese Werte durch Get () zurückgegeben werden, werden alle Kalenderfelder normalisiert.
Zum Beispiel interpretiert Gregoriancalendar im modischen Modus den Monat == Januar, Day_of_month == 32 als 1. Februar.
B. Wenn sich der Kalender im nicht-strengen Modus befindet, wird eine Inkonsistenz in seinem Kalenderfeld eine Ausnahme ausgelöst.
Zum Beispiel erzeugt Gregoriancalendar immer einen Tag_Of_month zwischen 1 und der Länge des Monats. Wenn Feldwerte außerhalb des Bereichs festgelegt wurden, wirft Gregoriancalendar im nicht strengen Modus eine Ausnahme bei der Berechnung der Zeit- oder Kalenderfeldwerte aus.
Hinweis: Die Ausnahme in Schritt (02) wird bei Verwendung von set () nicht geworfen, sondern nur in Funktionen wie Get (), GetTimeInmillis (), GetTime (), add () und Roll (). Denn set () legt nur ein Modifikationsflag fest, und Methoden wie Get () verursachen eine zeitliche Neuberechnung, und eine Ausnahme wird zu diesem Zeitpunkt ausgelöst!
(3) "Jahr, Monat, Tag, Zeitzone, Millisekundenfunktionen
// Set "Jahr, Monat, Tag", endgültiges Void -Set (int Jahr, Monat, Tag, Zeit, Zeit, int zweiter) // Set "Jahr, Monat, Tag, Zeit, Zeit, int zweiter) // Set" Jahr, Monat, Tag, Zeit, Minute, zweites "Final Void Set (int Jahr, Monat, Tag, Zeit, Minute, Second) // Date. Das Datum des Calenders. Holen Sie sich die Zeitzone, die dem Kalender Timezone GetTimezone () entspricht, // die Zeitzone festlegen, die dem Kalender-Void-SetTimezon (TimeZone Timezone) entspricht // den Wert von Milliscondes entspricht, der dem Kalender entspricht, was der Millisekunden von "Kalenderdatum" Distanz von "1970-01-01.01:00" -Stekon-Langzeit-Langzeit-Langzeit-Gentrat-Wert für den Milliscon-Wert für den Milliscon-Wert für die Milliscond-00-. Kalender void setTimeInmillis (lange Millisekunden)
Beispiele für die Verwendung dieser Funktionen finden Sie in der Funktion testTimeApis () im Beispiel calendartest.java.
(4) Andere Operationen
// Clone CalendarObject Clone () // Holen Sie sich "Welcher Wochentag ist der erste Wochentag". Zum Beispiel ist dieser Tag in den Vereinigten Staaten und in Frankreich diesen Tag Montag. Int GetFirstdayofweek () // Setzen Sie "Welcher Wochentag ist der erste Wochentag". Zum Beispiel ist dieser Tag in den Vereinigten Staaten und in Frankreich diesen Tag Montag. void setfirstdayofweek (int value) // Erhält die für die erste Woche des Jahres erforderliche Mindestanzahl von Tagen. Wenn beispielsweise die erste Woche den ersten Tag des ersten Monats des Jahres enthält, wird diese Methode zurückgegeben. Wenn die minimale Anzahl von Tagen eine volle Woche betragen muss, gibt diese Methode 7 zurück. Seien Sie eine volle Woche, diese Methode wird mit einem Wert von 7. void setminimaldaysinfirstWeek (int -Wert) aufgerufen.
Beispiele für die Verwendung dieser Funktionen finden Sie in der Funktion testotherapis () im Beispiel calendartest.java.
Beispiel für Teil 4 Kalender -Verwendung
Im Folgenden lernen wir die API mit Kalender anhand von Beispielen. Der Quellcode von Calendartest.java lautet wie folgt:
Import Java.util.date; Import Java.util.Calendar; Import Java.util.TimeZone; Import Java.util.Random; Calendartest {public static void main (String [] args) {// Test Calendars "öffentliche Funktionen mit 17 Fields" testallcalends (); // TestComparatorapis "Vergleichende Schnittstelle" des Kalenders (); // Testlenientapis () des Kalenders "vergleichende Schnittstelle" (); // Datum des Datums des Kalenders, Timezone, Millisekunden und andere verwandte Funktionen testItimeapis (); // Calendar's Clone (), GetFirstdayofweek () und andere Schnittstellen testotherapis (); } /** * Testen Sie "Kalenderfeld" * * @param Cal - Kalenderobjekt * @param Feld - "Kalenderfeld" zu testen. Kann die folgenden Werte sein: * Calendar.year, Calendar.month, Calendar.date, ... usw. * @param Titel - Titel */ private statische Void -Testsektion (Kalender, int, int Feld, String -Titel) {endgültig randal randal random = new random (); endgültiges Datum date = cal.getTime (); endgültig int min = cal.getMinimum (Feld); // "Feldmindestwert" endgültig int max = cal.getMaximum (Feld); // "Feld Maximal Value" endgültig int tructmin = cal.getactualminimum (Feld); // Erhalten Sie "den Mindestwert des Feldes unter dem aktuellen Datum" endgültig int taliaMax = cal.getactualMaximum (Feld); // Erhalten Sie "den Maximalwert des Feldes unter dem aktuellen Datum" // den aktuellen Wert des Feldes abschließend int ori = cal.get (Feld); // Setzen Sie "den aktuellen Wert des Feldes" und erhalten Sie "den Wert nach dem Einstellen" endgültig int r1 = random.nextint (max); Cal.set (Feld, R1); endgültig int set = cal.get (field); Versuchen Sie {// Zurück "den aktuellen Wert des Feldes": Rollen Sie zwischen "den Mindestwert des Feldes" und "den Maximalwert des Feldes" zurück. // "Rollenwert" kann positiv oder negativ sein. Cal.Roll (Feld, -max); } catch (illegalArgumentException e) {// Wenn field == calendar.zone_offset wird die Ausnahme ausgelöst! E. printstacktrace (); } final int roll = cal.get (field); // einen zufälligen Wert endgültig int sign = (random.nextint (2) == 1)? 1: -1; endgültig int r2 = sign * random.nextint (max); Versuchen Sie {// addieren Sie den aktuellen Wert des Feldes "und erhalten Sie" neuer aktueller Feldwert "// Der" Parameterwert "von Add kann positiv oder negativ sein. Cal.Add (Feld, R2); } catch (illegalArgumentException e) {// Wenn field == calendar.zone_offset wird die Ausnahme ausgelöst! E. printstacktrace (); } final int add = cal.get (field); // Druckfeldinformationssystem.out.printf ("%s:/n/trang is [%d -%d] tatsächliche Rang ist [%d -%d]. } / ** * Testkalender "öffentliche Funktionenschnittstelle mit 17 Feldern" * / private statische void testAllCalendarsets () {// 00. Era Field TestSektion (Calendar.getInstance (), Calendar.era, "Calendar.era"); // 01. Jahr Field TestSection (Calendar.getInstance (), Calendar.year, "Calendar.year"); // 02. Month Feldtestsektion (Calendar.getInstance (), Calendar.month, "Calendar.month"); // 03. week_of_year field testsection (calendar.getInstance (), calendar.week_of_year, "calendar.week_of_year"); // 04. week_of_month field testsection (calendar.getInstance (), calendar.week_of_month, "calendar.week_of_month"); // 05. Datum Feldtestsektion (Calendar.getInstance (), Calendar.date, "Calendar.Date"); // 06. DAY_OF_MONTH FELD TESTSECTICE (calendar.getInstance (), calendar.day_of_month, "Calendar.day_of_month"); // 07. Day_of_year Field TestSection (calendar.getInstance (), Calendar.day_of_year, "Calendar.day_of_year"); // 08. DAY_OF_WEEK field testSection(Calendar.getInstance(), Calendar.DAY_OF_WEEK, "Calendar.DAY_OF_WEEK"); // 09. DAY_OF_WEEK_IN_MONTH field testSection(Calendar.getInstance(), Calendar.DAY_OF_WEEK_IN_MONTH, "Calendar.DAY_OF_WEEK_IN_MONTH"); // 10. AM_PM field testSection(Calendar.getInstance(), Calendar.AM_PM, "Calendar.AM_PM"); // 11. HOUR field testSection(Calendar.getInstance(), Calendar.HOUR, "Calendar.HOUR"); // 12. HOUR_OF_DAY field testSection(Calendar.getInstance(), Calendar.HOUR_OF_DAY, "Calendar.HOUR_OF_DAY"); // 13. MINUTE field testSection(Calendar.getInstance(), Calendar.MINUTE, "Calendar.MINUTE"); // 14. SECOND field testSection(Calendar.getInstance(), Calendar.SECOND, "Calendar.SECOND"); // 15. MILLISECOND Field testSection(Calendar.getInstance(), Calendar.MILLISECOND, "Calendar.MILLISECOND"); // 16. ZONE_OFFSET Field testSection(Calendar.getInstance(), Calendar.ZONE_OFFSET, "Calendar.ZONE_OFFSET"); } /** * Test Calendar's "Compare Interface" */ private static void testComparatorAPIs() { // Create new cal1, and the time was 1988 Calendar cal1 = Calendar.getInstance(); cal1.set(Calendar.YEAR, 1988); // Create cal2, and the time is 2000 Calendar cal2 = Calendar.getInstance(); cal2.set(Calendar.YEAR, 2000); // Create cal3, which is a cloned object of cal111 Calendar cal3 = (Calendar)cal1.clone(); // equals determine whether the contents of "time, time zone, etc." of cal1 and cal2 are equal boolean isEqual12 = cal1.equals(cal2); // equals determine whether the contents of "time, time zone, etc." of cal1 and cal3 are equal boolean isEqual13 = cal1.equals(cal3); // cal1是否比cal2早boolean isBefore = cal1.before(cal2); // cal1是否比cal2晚boolean isAfter = cal1.after(cal2); // 比较cal1和cal2 // (01) 若cal1 早于cal2,返回-1 // (02) 若cal1 等于cal2,返回0 // (03) 若cal1 晚于cal2,返回1 int icompare = cal1.compareTo(cal2); System.out.printf("/ntestComparatorAPIs: isEuqal12=%s, isEqual13=%s, isBefore=%s, isAfter=%s, icompare=%s/n", isEqual12, isEqual13, isBefore, isAfter, icompare); } /** * 测试Calendar的“比较接口” */ private static void testLenientAPIs() { Calendar cal = Calendar.getInstance(); // 获取默认的“宽容度”。返回true boolean oriLenient = cal.isLenient(); // MONTH值只能是“0-11”,这里越界。但是由于当前cal是宽容的,所以不会抛出异常cal.set(Calendar.MONTH, 50); // 设置“宽容度”为false。 cal.setLenient(false); // 获取设置后的“宽容度” boolean curLenient = cal.isLenient(); try { // MONTH值只能是“0-11”,这里越界。而且当前cal是不宽容的,所以会产生异常。 // 但是,异常到下次计算日期时才会抛出。即,set()中不回抛出异常,而要等到get()中才会抛出异常cal.set(Calendar.MONTH, 50); // 此时,对cal进行读取。读取会导致重新计算cal的值,所以此时抛出异常! int m2 = cal.get(Calendar.MONTH); } catch (IllegalArgumentException e) { e.printStackTrace(); } System.out.printf("/ntestLenientAPIs: oriLenient=%s, curLenient=%s/n", oriLenient, curLenient); } /** * 测试Calendar的Date、TimeZone、MilliSecond等相关函数*/ private static void testTimeAPIs() { Calendar cal = Calendar.getInstance(); // 设置cal的时区为“GMT+8” cal.setTimeZone(TimeZone.getTimeZone("GMT+8")); // 获取当前的cal时区TimeZone timezone = cal.getTimeZone(); // 设置milliseconds cal.setTimeInMillis(1279419645742l); // 获取milliseconds long millis = cal.getTimeInMillis(); // 设置milliseconds之后,时间也改变了。 // 获取cal对应的日期Date date = cal.getTime(); // 设置时间为“1988-08-08” cal.set(1988, 08, 08); // 设置时间为“1999-09-09 09:09” cal.set(1999, 09, 09, 9, 9); // 设置时间为“2000-10-10 10:10:10” cal.set(2000, 10, 10, 10, 10, 10); System.out.printf("/ntestTimeAPIs: date=%s, timezone=%s, millis=%s/n", date, timezone, millis); } /** * 测试Calendar的clone(),getFirstDayOfWeek()等接口*/ private static void testOtherAPIs() { Calendar cal = Calendar.getInstance(); // 克隆cal Calendar clone = (Calendar)cal.clone(); // 设置为2013-01-10。 // 注:2013-01-01 为“星期二”,2013-01-06为“星期天”, clone.set(Calendar.YEAR, 2013); clone.set(Calendar.MONTH, 0); clone.set(Calendar.DATE, 10); // 设置“本年的第一个星期最少包含1天”。 // 则2013-01-10属于第2个星期clone.setMinimalDaysInFirstWeek(1); int m1 = clone.getMinimalDaysInFirstWeek(); int index1 = clone.get(Calendar.WEEK_OF_YEAR); // 设置“本年的第一个星期最少包含7天”。 // 则2013-01-10属于第1个星期clone.setMinimalDaysInFirstWeek(7); int m2 = clone.getMinimalDaysInFirstWeek(); int index2 = clone.get(Calendar.WEEK_OF_YEAR); // 设置“每周的第一天是星期几”。 clone.setFirstDayOfWeek(Calendar.WEDNESDAY); // 获取“每周的第一天是星期几”。 int firstdayOfWeek = clone.getFirstDayOfWeek(); System.out.printf("/ntestOtherAPIs: firstdayOfWeek=%s, [minimalDay, WeekOfYear]={(%s, %s), (%s, %s)} %s/n", firstdayOfWeek, m1, index1, m2, index2, clone.getTime()); }}第五部分自定义的Calendar接口示例
这些接口在写日历程序时可能会用到。
源代码如下(CalendarSelfDefineTest.java):
import java.util.Calendar;/** * 根据Calendar的API封装的一些常用函数*/public class CalendarSelfDefineTest { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // 设置日期为“2013-09-18” cal.set(2013, Calendar.SEPTEMBER, 18); // 获取“年” System.out.printf("year: %s/n", getYear(cal) ); // 获取“月” System.out.printf("month: %s/n", getMonth(cal) ); // 获取“上月” System.out.printf("previcou month: %s/n", getLastMonth(cal) ); // 获取“下月” System.out.printf("next month: %s/n", getNextMonth(cal) ); // 获取“日” System.out.printf("day: %s/n", getDay(cal) ); // 获取Cal对应星期几System.out.printf("weekday: %s/n", getWeekDay(cal) ); // 本月天数System.out.printf("Current Month days: %s/n", getMonthDays(cal) ); // 上月天数System.out.printf("Previcous Month days: %s/n", getPrevMonthDays(cal) ); // 下月天数System.out.printf("Next Month days: %s/n", getNextMonthDays(cal) ); // 获取当月第一天的星期几System.out.printf("First day' weekday : %s/n", getFirstDayWeekday(cal) ); // 获取当前月最后一天的星期几System.out.printf("Last day' weekday : %s/n", getLastDayWeekday(cal) ); // 获取上月最后一天的星期几System.out.printf("PrevMonth Last day' weekday: %s/n", getLastDayWeekdayOfPrevMonth(cal) ); // 获取下月第一天的星期几System.out.printf("NextMonth First day' weekday: %s/n", getFirstDayWeekdayOfNextMonth(cal) ); } /** * 获取“年” * * @return 例如,2013-09-18,则返回2013 */ public static int getYear(Calendar cal) { return cal.get(Calendar.YEAR); } /** * 获取“月” * * @return 返回值可以为以下值: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER。 * 其中第一个月是JANUARY,它为0。 * * 例如,2013-09-18,则返回8 */ public static int getMonth(Calendar cal) { return cal.get(Calendar.MONTH); } /** * 获取“上一个月” * * @return 返回值可以为以下值: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER。 * 其中第一个月是JANUARY,它为0。 * * 例如,2012-01-12的上一个月是“11”(即DECEMBER)。 */ public static int getLastMonth(Calendar cal) { return (cal.get(Calendar.MONTH) + 11) % 12; } /** * 获取“下一个月” * * @return 返回值可以为以下值: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER。 * 其中第一个月是JANUARY,它为0。 * * 例如,2013-12-12的下一个月是“1”(即DECEMBER)。 */ public static int getNextMonth(Calendar cal) { return (cal.get(Calendar.MONTH) + 13) % 12; } /** * 获取“日” * * @return 例如,2013-09-18,则返回18 * */ public static int getDay(Calendar cal) { return cal.get(Calendar.DATE); } /** * 获取“本月的天数” * * @return 例如,2013-09-18,则返回30 * */ public static int getMonthDays(Calendar cal) { return cal.getActualMaximum(Calendar.DATE); } /** * 获取“上一个月的天数” * * @return 例如,2013-01-18,则返回31 (因为2012-12有31天) * */ public static int getPrevMonthDays(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面对tmpCal操作,就不会改变cal tmpCal.add(Calendar.MONTH, -1); // 设为“上一个月” return tmpCal.getActualMaximum(Calendar.DATE); } /** * 获取“下一个月的天数” * * @return 例如,2013-12-18,则返回31 (因为2014-01有31天) * */ public static int getNextMonthDays(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面对tmpCal操作,就不会改变cal tmpCal.add(Calendar.MONTH, 1); // 设为“下一个月” return tmpCal.getActualMaximum(Calendar.DATE); } /** * 获取Cal对应星期几* * @return 返回“星期几”,可以为以下值: * SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY 和SATURDAY。 * SUNDAY为1,MONDAY为2,依次类推。 * 例如,2013-09-18(星期三),则返回4 */ public static int getWeekDay(Calendar cal) { return cal.get(Calendar.DAY_OF_WEEK); } /** * 获取当月第一天对应星期几* * @return SUNDAY为1,MONDAY为2,依次类推。 */ public static int getFirstDayWeekday(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面对tmpCal操作,就不会改变cal tmpCal.set(Calendar.DATE, 1); // 把日期设置为当月第一天return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * 获取当前月最后一天对应星期几* * @return SUNDAY为1,MONDAY为2,依次类推。 */ public static int getLastDayWeekday(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面对tmpCal操作,就不会改变cal tmpCal.set(Calendar.DATE, 1); // 把日期设置为当月第一天tmpCal.roll(Calendar.DATE, -1); // 把日期设置为当月最后一天return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * 获取上月最后一天的星期几* * @return SUNDAY为1,MONDAY为2,依次类推。 */ public static int getLastDayWeekdayOfPrevMonth(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面对tmpCal操作,就不会改变cal tmpCal.set(Calendar.DATE, 1); // 把日期设置为当月第一天tmpCal.add(Calendar.DATE, -1); // 把日期设置为上一个月最后一天return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * 获取下月第一天的星期偏移* * @return SUNDAY为1,MONDAY为2,依次类推。 */ public static int getFirstDayWeekdayOfNextMonth(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // 克隆cal。后面对tmpCal操作,就不会改变cal tmpCal.add(Calendar.MONTH, 1); // 设为“下一个月” tmpCal.set(Calendar.DATE, 1); // 设为“第一天” return tmpCal.get(Calendar.DAY_OF_WEEK); } }