Première partie Introduction
Définition du calendrier:
Le calendrier de classe abstrait public implémente sérialisable, clonable, comparable <Allendar> {} Le calendrier peut être considéré comme une classe abstraite.
Son implémentation adopte la méthode d'usine dans le modèle de conception. Il se manifeste dans: lorsque nous obtenons l'instance de calendrier, le calendrier renverra l'objet de calendrier correspondant en fonction des paramètres passés. Il existe deux façons d'obtenir une instance de calendrier:
(1) Lorsque nous obtenons le calendrier via calendar.getInstance (), la valeur par défaut est un objet GregorianCalendar renvoyé.
Gregoriancalendar est une classe de mise en œuvre de calendrier qui fournit un système de calendrier standard utilisé dans la plupart des pays du monde.
(2) Lorsque nous obtenons le calendrier via Calendar.GetInstance (fuseau horaire du fuseau horaire, paramètres locaux) ou calendar.gendance (fuseau horaire) ou calendar.getinstance (région des paramètres locaux), il renvoie le "calendrier utilisé par le fuseau horaire correspondant (zone) ou la région (locale), etc.".
Par exemple, s'il s'agit du Japon, l'objet japonais ImperialCalendar est retourné.
Reportez-vous au code suivant:
public static Calendar getInstance () {// Appelez CreateCalendar () pour créer Calendar Calendar = CreateCalendar (Timezone.getDefaultref (), Locale.getDefault ()); cal.sharedzone = true; Retour Cal;} Calendrier statique public GetInstance (Zone du Timezone) {// Appelez CreateCalendar () pour créer Calendar Return Createdar (Zone, Locale.getDefault ());} Calendrier statique public GetInstance (Locale Alocale) {// Call CreateCalendar () pour créer Calendar ALOCALE); cal.sharedzone = true; Retour Cal;} Calendrier statique public GetInstance (Zone de fuseau horaire, Locale Alocale) {// Appeler CreateCalendar () pour créer un calendrier Retour CreateCalendar (Zone, Alocale);} Calendrier statique privé CreateCalendar (Zone de Zone Time, Retour le BuddhacaledAl est "jp", il renvoie l'objet japonais ImperialCalendar if ("th" .equals (alocale.getLanguage ()) && ("th" .equals (alocale.getcountry ()))) {return new.util.buddhistcalendar (zone, alocale); } else if ("jp" .equals (alocale.getVariant ()) && "jp" .equals (alocale.getCountry ())) && "ja" .equals (Alocale.getLanguage ()))) {return new japanesialCalendar (Zone, alocale); } // (03) Sinon, renvoyez l'objet GregorianCalendar. retourner le nouveau Gregoriancalendar (Zone, Alocale); }Après avoir obtenu l'instance du calendrier, nous pouvons manipuler le calendrier via certaines méthodes de colonne fournies par le calendrier.
Partie 2 Principes et pensées du calendrier
Lorsque nous utilisons le calendrier, nous ne sommes rien de plus que d'exploiter les champs de "l'année, le mois, le jour, la semaine, l'heure, la minute et le deuxième" du calendrier. Ci-dessous, nous apprenons les méthodes de source, de définition et de calcul de ces champs.
1. Calendrier la source de chaque valeur de champ
Lorsque nous utilisons le calendrier, nous utilisons simplement des informations telles que "année, mois, jour, semaine, heure, minute et seconde". Alors, comment cela l'a-t-il fait? Essentiellement, Calendar fait gagner du temps. La définition suivante:
// Le temps est l'heure actuelle, en millisecondes. // C'est la différence entre la distance dans le temps en cours "1er janvier 1970, 0:00:00 GMT". protégé depuis longtemps;
Le calendrier calcule des informations telles que "l'année du calendrier, le mois, le jour, la semaine, l'heure, la minute, le deuxième" en fonction de l'heure.
2. Définition et initialisation de chaque domaine du calendrier
L'information "Année, Mois, Jour, semaine, Hour, Minute et Second" de Calendar a un total de 17 champs.
Nous utilisons le calendrier, qui n'est rien de plus que ces 17 champs. Leurs définitions sont les suivantes:
(Champ 0) INTR ERA STATIQUE PUBLIQUE = 0;
Description: Era.
Valeur: ne peut être que 0 ou 1. 0 signifie BC ("avant Christ", c'est-à-dire BC), 1 signifie AD (latin "Anno Domini", c'est-à-dire AD).
(Champ 1) Année d'int statique finale publique = 1;
Description: Année.
(Champ 2) Mois d'int statique final public = 2;
Description: Valeur mensuelle: Peut être janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre, Undecimber.
Le premier mois est en janvier, qui est 0.
(Champ 3) public final static int semaine_of_year = 3;
Remarque: La date actuelle correspond à la semaine de l'année. La valeur de la première semaine de l'année est de 1.
(Champ 4) public final static int semaine_of_month = 4;
Remarque: La date en cours correspond à la semaine du mois. La valeur de la première semaine d'un mois est de 1.
(Champ 5) Date d'int statique finale publique = 5;
Description: jour. La valeur du premier jour d'un mois est de 1.
(Champ 5) public final static int day_of_month = 5;
Remarque: Identique à "Date", signifie "jour".
(Champ 6) public final static int day_of_year = 6;
Remarque: Quel jour la date actuelle correspond-elle à cette année? La valeur du premier jour de l'année est de 1.
(Champ 7) public final static int day_of_week = 7;
Description: Quel jour de la semaine.
Valeurs: Peut être dimanche, lundi, mardi, mercredi, jeudi, vendredi et samedi.
Parmi eux, le dimanche est 1, le lundi a 2 ans, etc.
(Champ 8) public final static int day_of_week_in_month = 8;
Description: Quelle semaine du mois en cours.
Valeurs: day_of_month 1 à 7 correspond toujours à day_of_week_in_month 1; 8 à 14 correspondent toujours à day_of_week_in_month 2, et ainsi de suite.
(Champ 9) public final statique int am_pm = 9;
Description: Valeur du matin ou de l'après-midi: peut être AM ou PM. AM est 0, indiquant le matin; Le PM est 1, indiquant l'après-midi.
(Champ 10) Hour d'int statique finale publique = 10;
Description: indique l'heure de la journée.
L'heure est utilisée pour les horloges de 12 heures (0 - 11). Midi et minuit sont représentés par 0, pas 12.
(Champ 11) public final statique int hour_of_day = 11;
Description: indique l'heure de la journée.
Hour_of_day est utilisé pour une horloge 24h / 24. Par exemple, au moment de 10: 04: 15.250 PM, Hour_OF_DAY est 22.
(Champ 12) Public final statique Int Minute = 12;
Description: Quelle minute d'une heure?
Par exemple, au moment de 10: 04: 15,250 pm, la minute est 4.
(Champ 13) public final statique int seconde = 13;
Description: quelle deuxième dans une minute.
Par exemple, au moment de 10: 04: 15,250 pm, le deuxième est 15.
(Champ 14) public final statique int Millisecond = 14;
Description: Quelles millisecondes de seconde.
Par exemple, au moment de 10: 04: 15.250, la milliseconde est 250.
(Champ 15) public final static int zone_offset = 15;
Remarque: les millisecondes indiquent le décalage approximatif de GMT.
(Champ 16) public final statique int dst_offset = 16;
Description: Les millisecondes indiquent le décalage de l'heure d'été.
public final static int champ_count = 17;
Ces 17 champs sont enregistrés dans le tableau INT. La définition est la suivante:
// Enregistrer le tableau de ces 17 champs protégés Int Fields []; // Le calendrier de la fonction de définition du tableau (Zone du Zone Timezone, Locale Alocale) {// Initialize "Fields Array" Fields = new int [field_count]; isset = new boolean [field_count]; Stamp = new int [field_count]; this.zone = zone; setWeekCountData (Alocale);}Calendrier protégé (zone de fuseau horaire, Locale Alocale) Il s'agit du constructeur du calendrier. Il sera appelé par son constructeur de sous-classe, créant ainsi un nouveau tableau de "Enregistrer 17 données sur le terrain du calendrier".
3. Calendrier Calendrier Le calcul de chaque valeur de champ
Prenons Get Get (Int Field) comme exemple pour expliquer brièvement le calcul et le fonctionnement des 17 champs de Calendar. GET (INT Field) est d'obtenir la valeur du champ "Field". Sa définition est la suivante:
public int get (int champ) {// Calculez les valeurs de chaque champ complet (); // renvoie la valeur du champ Retour Internalget (champ);} Remarque: Le code de Get (champ int) est très simple. Tout d'abord, calculez les valeurs de chaque champ via complet (), puis renvoyez "la valeur du champ de champ" via InternalGet (champ).
La fonction de complete () est de calculer les valeurs de chaque champ de calendrier. Il est défini dans Calendar.java, le code est le suivant:
Protected void complet () {if (! IsTimeset) updateTime (); if (! areFieldsSet ||! areallFieldsSet) {calculFields (); // remplit les champs ungrés areallFieldsSet = areFieldsSet = true; }} private void updateTime () {compactEtime (); IsTimesET = true;} updateTime () Le ordinateur () appelé est défini dans la classe d'implémentation de Calendar.java. Ci-dessous, je répertorie l'implémentation de l'ordinateur () dans GregorianCalendar.java: Protected void compction () {// En mode non légère, effectuez une brève vérification des champs calendaires // qui ont été définis externe. Grâce à cette vérification //, les valeurs de champ sont stockées dans les champs originaux [] // pour voir si l'un d'eux est normalisé plus tard. if (! isLenient ()) {if (originalFields == null) {originalFields = new int [field_count]; } pour (int champ = 0; champ <champ_count; champ ++) {int value = internalGet (champ); if (isExternallySet (champ)) {// Validation rapide pour toutes les valeurs hors plage if (value <getMinimum (champ) || value> getMaxim (champ)) {lancez new illégalArgumentException (getFieldName (champ)); }} originalFields [champ] = valeur; }} // Laissez la super classe déterminer les champs de calendrier à utiliser // utilisés pour calculer l'heure. int FieldMask = selectFields (); // L'année par défaut du début de l'époque. Nous ne vérifions pas // le masque de terrain pour l'année car l'année est un champ obligatoire pour // déterminer la date. int an = isset (année)? InternalGet (année): epoch_year; int Era = internalgetera (); if (era == bce) {année = 1 - an; } else if (era! = ce) {// Même en mode clémente, nous interdisons les valeurs de l'ERA autres que CE & BCE. // (la même règle de normalisation que ajouter () / roll () pourrait être // appliquée ici en mode clémente. Mais cette vérification est maintenue // inchangée pour la compatibilité à partir de 1,5.) Jetez une nouvelle conduite illégalargumentException ("ERA non valide"); } // Si l'année est 0 ou négative, nous devons définir la valeur de l'ère plus tard. if (année <= 0 &&! isset (ERA)) {fieldmask | = erra_mask; setFieldsCompuded (ERA_MASK); } // Calculez l'heure de la journée. Nous comptons sur la convention selon laquelle // un champ non défini a 0. De même temps de jour = 0; if (isFielDset (FieldMask, hour_of_day)) {timeofday + = (long) internalget (hour_of_day); } else {timeofday + = internalGet (hour); // La valeur par défaut d'AM_PM est 0 qui désigne AM. if (isFielDset (FieldMask, AM_PM)) {TimeOfday + = 12 * internalGet (AM_PM); }} timeofday * = 60; Timeofday + = internalget (minute); Timeofday * = 60; Timeofday + = internalGet (deuxième); Timeofday * = 1000; Timeofday + = internalget (millisecond); // Convertir l'heure de la journée en nombre de jours et le décalage // milliseconde à partir de minuit. long fixedDate = timeofday / one_day; Timeofday% = one_day; while (timeofday <0) {timeofday + = one_day; - FixedDate; } // Calculez la date fixe depuis le 1er janvier 1 (grégorien). CalculateFixedDate: {long gfd, jfd; if (année> Gregoriancutoveloverear && année> GregoriancutoveloverAearJulian) {gfd = fixeddate + getFixedDate (gcal, année, fieldmask); if (gfd> = gregoricancutOverDate) {fixedate = gfd; Break CalculedFixedDate; } jfd = fixedDate + GetFixedDate (getJuliancAlEndArsystem (), année, champs de champs); } else if (année <gregoricancutoveloverear && année <gregoricancutouveroearjulian) {jfd = fixe + getFixedDate (getJuliancalendarSystem (), année, champs de champs); if (jfd <gregoricancutOverDate) {fixedate = jfd; Break CalculedFixedDate; } gfd = fixedDate + getFixedDate (gcal, année, champs de champ); } else {gfd = fixedDate + getFixedDate (gcal, année, champs de champs); jfd = fixedDate + GetFixedDate (getJuliancAnDarSystem (), année, champs de champs); } // Nous devons maintenant déterminer de quelle date de calendrier c'est. if (gfd> = gregoricancutOverDate) {if (jfd> = gregoricancutOverDate) {fixedDate = gfd; } else {// La date est dans une période de "chevauchement". Aucun moyen // de le désambiguïser. Déterminez-le en utilisant le calcul de la date précédent. if (calsys == gcal || calsys == null) {fixedDate = gfd; } else {fixedDate = jfd; }}} else {if (jfd <gregoricancutoverDate) {fixedDate = jfd; } else {// La date est dans une période "manquante". if (! isLenient ()) {lancer un nouveau IllégalArgumentException ("la date spécifiée n'existe pas"); } // Prenez la date julienne pour la compatibilité, qui // produira une date grégorienne. fixedDate = jfd; }}} // Millis représente le temps local de horloge murale en millisecondes. long millis = (fixedDate - epoch_offset) * one_day + timeofday; // Calculez le décalage du fuseau horaire et le décalage DST. Il y a deux ambiguïtés potentielles ici. Nous supposerons un temps de basculement de 2h00 (heure du mur) // à des fins de discussion ici. // 1. La transition vers DST. Ici, une heure conçue de 2h00 - 2h59 // peut être en standard ou en TRS en fonction. Cependant, 2h00 est une représentation invalide // (la représentation saute de 1h59:59 MST à 3h00 du matin). // Nous supposons l'heure standard. // 2. La transition de DST. Ici, une heure conçue de 1h00 - 1h59 // peut être en standard ou en DST. Les deux sont des représentations valides (le représentant // saute de 1:59:59 DST à 1:00:00 Std). // Encore une fois, nous supposons l'heure standard. // Nous utilisons l'objet Timezone, à moins que l'utilisateur ne définisse explicitement les champs ZONE_OFFSET // ou DST_OFFSET; Ensuite, nous utilisons ces champs. Zone de fuseau horaire = getZone (); if (ZoneOffSets == null) {ZoneOffSets = new int [2]; } int tzmask = fieldmask & (zone_offset_mask | dst_offset_mask); if (tzmask! = (zone_offset_mask | dst_offset_mask)) {if (zones instanceof ZoneInfo) {((ZoneInfo) Zone) .getOffSetsBywall (Millis, ZoneOffSets); } else {int gmtoffset = isFielDset (fieldmask, zone_offset)? InternalGet (Zone_offset): zone.getrawoffset (); Zone.GetOffSets (Millis - GMTOffset, ZoneOffSets); }} if (tzmask! = 0) {if (isFielDset (tzmask, zone_offset)) {ZONEOFFSETS [0] = internalget (zone_offset); } if (isFielDset (tzmask, dst_offset)) {ZoneOffSets [1] = internalGet (dst_offset); }} // ajustez les valeurs de décalage du fuseau horaire pour obtenir le temps UTC. Millis - = ZoneOffSets [0] + ZoneOffSets [1]; // Réglez le temps de ce calendrier en millisecondes Time = Millis; int mask = calculFields (champs de champ | getSetStateFields (), tzmask); if (! isLenIent ()) {for (int champ = 0; champ <champ_count; champ ++) {if (! isExternallySet (champ)) {continuant; } if (originalFields [Field]! = internalGet (champ)) {// Restaurer les valeurs de champ d'origine System.ArrayCopy (OriginalFields, 0, Fields, 0, Fields.Length); lancer un nouveau IllégalArgumentException (getFieldName (champ)); }}} setFieldsNormalized (masque);} Ensuite, jetons un coup d'œil à la définition de Internalget (champ). comme suit:
Protégé final int internetalGet (Int champ) {champs de retour [champ];} À partir de cela, nous pouvons voir que GET (INT Field) renvoie finalement la valeur via InternalGet (champ int).
InternalGet (INT Field) renvoie en fait l'élément de champ dans le tableau de champ. Cela correspond aux 17 éléments du calendrier!
En bref, ce que nous devons comprendre, c'est: le calendrier calcule "l'année, le mois, le jour, l'heure, la minute, le deuxième" et ainsi de suite en fonction d'un temps (millisecondes), afin de faciliter nos opérations sur "l'année, le mois, le jour, l'heure, la minute, le deuxième" et ainsi de suite. Ci-dessous, nous introduisons les fonctions de fonctionnement pertinentes fournies par le calendrier ci-dessous.
Interface de fonction du calendrier de partie 3
1. Interface commune de 17 champs de calendrier
Ces 17 champs de calendrier soutiennent l'interface de fonction publique suivante. Pour des exemples d'utilisation de ces interfaces communes, veuillez vous référer à la fonction TestAllCalendaSection () dans l'exemple Calendartest.java.
(1) getMaximum (champ int)
Fonction: Obtenez la "valeur maximale du champ". Remarque "Comparez la différence entre celle-ci et GetactualMaxiMum ()". Exemple: en termes de champ "mois". Comment l'utiliser est:
// obtient le calendrier Calendar Cal = calendar.getInstance (); // Obtenez la valeur maximale du mois int max = cal.getMaxim (calendar.month);
Pour obtenir la valeur maximale des autres champs, il vous suffit de remplacer le mois correspondant dans l'exemple par d'autres noms de champ.
(2) GetactualMaximum (champ int)
Fonction: Obtenez la "valeur maximale de ce champ sous la date actuelle". Exemple: en termes de champ "mois". Comment l'utiliser est:
// obtient le calendrier Calendar Cal = calendar.getInstance (); // Obtenez la valeur maximale du mois en cours int max = cal.getactualMaxim (calendar.month);
Pour obtenir la valeur maximale des autres champs, il vous suffit de remplacer le mois correspondant dans l'exemple par d'autres noms de champ.
Remarque: Comparez la différence entre getactualmaximum () et getMaxim (). Reportez-vous à l'exemple de comparaison ci-dessous,
A. La "valeur maximale de champ" obtenue par getMaxim () fait référence à la "valeur maximale de champ" obtenue dans toutes les dates combinées.
Par exemple, l'objectif de getMaximum (calendar.date) est de "obtenir le" maximum du jour "". Sur la base de toutes les dates, un maximum de 31 jours par mois est obtenu. Par conséquent, la valeur de retour de getMaxiMum (calendar.date) est "31"!
B. GetactualMaxim () obtient la "valeur maximale de ce champ à la date actuelle".
Par exemple, lorsque la date est 2013-09-01, GetactualMaxim (calendar.date) est d'obtenir "maximum de jour" et est "30". La date en cours est en septembre et septembre n'est que de 30 jours. Par conséquent, la valeur de retour de GetactualMaximum (calendar.date) est "30"!
(3) getMinimum (champ int)
Fonction: Obtenez la "valeur minimale du champ". Remarque "Comparez la différence entre celui-ci et getactualMinimum ()". Exemple: en termes de champ "mois". Comment l'utiliser est:
// obtient l'instance calendaire calendaire cal = calendar.getInstance (); // Obtenez la valeur minimale du mois int min = cal.getMinimum (calendar.month);
Pour obtenir la valeur minimale des autres champs, il vous suffit de remplacer le mois correspondant dans l'exemple par d'autres noms de champ.
(4) getactualminimum (champ int)
Fonction: Obtenez la "valeur minimale de ce champ sous la date actuelle". Exemple: en termes de champ "mois". Méthode d'utilisation: // Obtenez l'instance de calendrier Calendar Cal = Calendar.getInstance (); // Obtenez la valeur minimale du mois int min = cal.getMinimum (calendar.month);
Pour obtenir la valeur minimale des autres champs, il vous suffit de remplacer le mois correspondant dans l'exemple par d'autres noms de champ.
Remarque: dans le calendrier par défaut de Java, bien que getMinimum () et getactualMinimum () aient des significations différentes; Cependant, leurs valeurs de retour sont les mêmes. Parce que la valeur par défaut du calendrier est de renvoyer l'objet GregorianCalendar, dans GregorianCalendar.java, getMinimum () et getactualminimum () renvoie la même valeur.
(5) Get (Int champ)
Fonction: Obtenez la "valeur actuelle du champ". Obtient la valeur actuelle du champ de champ. Exemple: en termes de champ "mois". La méthode de "Obtenir la valeur actuelle du mois" est:
// obtient le calendrier Calendar Cal = calendar.getInstance (); // Obtenez la valeur du mois en cours de "Cal Calendar" int mois = cal.get (calendar.month);
Pour obtenir la valeur actuelle des autres champs, il vous suffit de remplacer le mois correspondant dans l'exemple par d'autres noms de champ.
(6) set (champ int, valeur int)
Fonction: Définissez la "valeur actuelle du champ". Définissez la valeur actuelle du champ sur le champ pour valeur l'exemple: en termes de champ "mois". La méthode de «définition de la valeur actuelle du mois» est:
// Obtenir le calendrier Calendar Cal = Calendar.getInstance (); // Définissez la valeur du mois en cours de "Cal Calendar" à 1988 Cal.Set (Calendar.month, 1988);
illustrer:
A. 1988 est la valeur actuelle du mois que vous souhaitez définir. Cette valeur de réglage doit être un entier.
B. Pour définir la valeur actuelle des autres champs, il vous suffit de remplacer le mois correspondant dans l'exemple par d'autres noms de champ.
(7) ajouter (champ int, valeur int)
Fonction: Ajoutez une valeur à la "valeur actuelle du champ". Ajoutez une valeur à la valeur actuelle du champ de champ. Exemple: en termes de champ "mois". La méthode est la suivante:
// Obtenez l'instance de calendrier et définissez la date sur "2013-09-01" Calendar Cal = calendar.getInstance (); cal.set (calendar.year, 2013); cal.set (calendar.month, 8); cal.sendar (calendar.date, 1); // add -10 "Cal.add (calendar.month, -10);
illustrer:
A. -10 est la valeur ajoutée.
La valeur ajoutée peut être un nombre positif ou négatif.
Un nombre positif indique que la date est augmentée et un nombre négatif indique que la date est diminuée.
Assomption: Maintenant, la valeur de CAL est "2013-09-01", maintenant nous augmentons la valeur du champ de mois -10. Le résultat est: "2012-10-01".
Pourquoi cela se produit-il? "2013-09-01" augmente -10, ce qui signifie réduire la date à l'avance de 10 mois; Le résultat est "2012-10-01".
B. Parmi les 17 champs du calendrier: à l'exception de Rolling Back Calendar.zone_offset, une exception illégalargumentException sera lancée; D'autres champs soutiennent cette opération.
C. Pour définir la valeur actuelle des autres champs, il vous suffit de remplacer le mois correspondant dans l'exemple par d'autres noms de champ.
(8) rouleau (champ int, valeur int)
FONCTION: Retournez la "valeur actuelle du champ" Exemple: Prenez le champ "Mois". La méthode de "retourner la valeur actuelle du mois" est:
// Obtenez l'instance de calendrier et définissez la date sur "2013-09-01" Calendar Cal = calendar.getInstance (); cal.set (calendar.year, 2013); cal.set (calendar.month, 8); cal.set (calendar.date, 1); // "Scroll Forward 10" Cal.Roll (Calendar.monthmont, -10);
illustrer:
A. -10 est la valeur en arrière.
Lorsque la valeur de recul est un nombre négatif, cela signifie faire avancer le champ actuel;
Lorsque la valeur de recul est un nombre positif, cela signifie faire reculer le champ actuel.
Lorsque vous reculez un champ dans le calendrier, ne changez pas le champ plus grand!
C'est la différence de base entre rouler () et add ()! Add () peut modifier des champs plus grands, tels que "Utilisation d'ajout () pour modifier le champ" mois ", il peut provoquer un changement dans le champ" l'année ""; Mais roll () ne changera pas de champs plus grands, tels que «Utilisation de Roll () pour modifier le champ« mois », il ne provoquera pas de changement dans le champ« l'année ».
Assomption: Maintenant, la valeur de CAL est "2013-09-01", maintenant nous augmentons la valeur du champ de mois -10. Le résultat est: "2013-10-01".
Pourquoi cela se produit-il? En effet, "Rollback" signifie "rouler d'avant en arrière entre le minimum et le maximum". Dans cet exemple, le mois est en septembre, et le recul précédent est de 10, et la valeur obtenue est octobre, mais Roll () ne changera pas le champ "supérieur au mois", donc le champ de l'année ne changera pas. Le résultat est donc "2013-10-01".
B. Parmi les 17 champs du calendrier: à l'exception de Rolling Back Calendar.zone_offset, une exception illégalargumentException sera lancée; D'autres champs soutiennent cette opération.
C. Pour définir la valeur actuelle des autres champs, il vous suffit de remplacer le mois correspondant dans l'exemple par d'autres noms de champ.
(9) Clear (champ int)
Fonction: effacez la "valeur actuelle du champ". La soi-disant compensation définit en fait la valeur du "champ" à 0; Si la valeur minimale du champ est 1, elle est définie sur 1. Exemple: En termes de champ "mois". La méthode de "mois clair" est:
// Obtenez l'instance du calendrier et définissez la date sur "Septembre" Calendar Cal = Calendar.getInstance (); Cal.Set (Calendar.month, 9); // Clear MonthCal.Clear (Calendar.month);
Pour effacer d'autres champs, il vous suffit de remplacer le mois correspondant dans l'exemple par d'autres noms de champ.
(10) ISSET (champ int)
Fonction: Déterminez si le «champ de champ» est défini. Si Clear () est appelé, le champ devient "aucun état défini". Exemple: en termes de champ "mois". La méthode de "juger si le mois est défini" est:
// Obtenez l'instance calendaire Calendar Cal = Calendar.getInstance (); // Déterminez si le mois est défini Boolean bSet = Cal.isset (calendar.month);
Pour déterminer d'autres champs, il vous suffit de remplacer le mois correspondant dans l'exemple par d'autres noms de champs.
2. Autres fonctions du calendrier
(1) Fonction de comparaison de date
La fonction de comparaison du calendrier comprend principalement les éléments suivants:
// Comparez si la date, le fuseau horaire et d'autres contenus de "l'objet de calendrier actuel" et "calendrier" sont égaux. Booléan est égal (objet objet) // si l'objet calendrier actuel est plus tôt que CalendarBoolean avant (calendrier d'objet) // L'objet de l'objet Calendaire actuel est plus tard que CalendarBoolean après (Calendrier d'objet) // Comparez "objet de calendrier actuel" et "calendrier". // Si plus tôt que "calendrier", renvoyez -1 // en cas d'égalité, retournez 0 // si plus tard que "Calendar", retournez 1Int comparé (calendrier AnotherCalendar)
Pour des exemples d'utilisation de ces fonctions, veuillez vous référer à la fonction TestComparatorApis () dans l'exemple Calendartest.java.
Exemple: Supposons que Cal1 et Cal2 soient tous deux deux objets de calendrier.
// Leurs méthodes d'utilisation sont les suivantes Boolean isEqual = Cal1.equals (Cal2); Boolean isBefore = Cal1.before (Cal2); booléen isafter = Cal1.After (Cal2); int iCompare = Cal1.compareto (CAL2);
(2) fonction "tolérance"
// Définir la "tolérance du calendrier" vide setLenientient (valeur booléenne) // Obtenez "Tolérance au calendrier" Boolean isLenient ()
Pour des exemples d'utilisation de ces fonctions, veuillez vous référer à la fonction TestLenIentapis () dans l'exemple Calendartest.java.
illustrer:
Le calendrier a deux modes qui interprètent les champs de calendrier, à savoir la clémentiel et non-légende.
A. Lorsque le calendrier est en mode indulgent, il peut accepter des valeurs dans une plage plus grande que la plage de champs de calendrier qu'il génère. Lorsque le calendrier recalcule les valeurs de champ de calendrier afin que ces valeurs soient renvoyées par get (), tous les champs de calendrier sont normalisés.
Par exemple, GregorianCalendar en mode clément interprète le mois == janvier, day_of_month == 32 au 1er février.
B. Lorsque le calendrier est en mode non dirigeant, s'il y a une incohérence dans son domaine du calendrier, il lèvera une exception.
Par exemple, GregorianCalendar génère toujours une valeur day_of_month entre 1 et la durée du mois. Si des valeurs de champ en dehors de la plage ont été définies, GregorianCalendar en mode non légende lance une exception lors du calcul des valeurs de champ de temps ou de calendrier.
Remarque: L'exception à l'étape (02) ne sera pas lancée lors de l'utilisation de set (), mais ne sera lancée que dans des fonctions telles que get (), getTimeInmilis (), getTime (), add () et roll (). Parce que set () ne fait que définir un drapeau de modification, et des méthodes telles que get () entraîneront un recalcul de temps, et une exception sera lancée à ce moment!
(3) "Année, mois, jour, fuseau horaire, fonctions de millisecondes
// Set "Année, mois, jour" "Final Void Set (int, mois, jour, heure, heure, int, deuxième) // Set" Année, mois, jour, heure, heure, int, deuxième) //e, heure, heure, deuxième, deuxième) // Obtenir la date de la date de la date de la date de la date () //) // Set Callend Obtenez le fuseau horaire correspondant à Calendar Timezone gettimeZone () // Définissez le fuseau horaire correspondant à Calendar Void setTimeZone (Timezone Timezone) // Obtenez la valeur actuelle des millisques correspondant à "1970-01-01 0:00:00 GMT" Calendrier vide setTimeInmillis (long millisecondes)
Pour des exemples d'utilisation de ces fonctions, veuillez vous référer à la fonction TestTimeapis () dans l'exemple Calendartest.java.
(4) Autres opérations
// Clone CalendarObject Clone () // Obtenez "Quel jour de la semaine est le premier jour de la semaine". Par exemple, aux États-Unis, cette journée est dimanche et en France, cette journée est lundi. int getFirstDayofweek () // Définir "Quel jour de la semaine est le premier jour de la semaine". Par exemple, aux États-Unis, cette journée est dimanche et en France, cette journée est lundi. void setFirstDayofweek (intruct) // obtient le nombre minimum de jours requis pour la première semaine de l'année. Par exemple, si la première semaine contient le premier jour du premier mois de l'année, cette méthode reviendra 1. Si le nombre minimum de jours doit être une semaine complète, cette méthode renvoie 7. int getMinImalsInFirstWeek () // Définit le nombre minimum de jours requis pour la première semaine de l'année, par exemple, si la première semaine contient le premier jour du premier mois de l'année, cette méthode est appelée avec une valeur 1. Soyez une semaine complète, cette méthode est appelée avec une valeur de 7. void setMinImalDaySInFirstweek (INT Valeur)
Pour des exemples d'utilisation de ces fonctions, veuillez vous référer à la fonction Testotheapis () dans l'exemple Calendartest.java.
Partie 4 Exemple d'utilisation du calendrier
Ci-dessous, nous apprenons l'API en utilisant le calendrier à travers des exemples. Le code source de Calendartest.java est le suivant:
Importer java.util.date; import java.util.calendar; import java.util.timezone; import java.util.random; public class Calendartest {public static void main (string [] args) {// test de test de Calendar de Calendar avec 17 champs "TestallCalendarsection (); // Tester «Interface comparative» de TestComparatorapis (); // Tester TestLenIentAPis (interface comparative du calendrier "; // Testez la date du calendrier, le fuseau horaire, la milliseconde et d'autres fonctions connexes TestTiapis (); // Tester Calendar's Clone (), GetFirstDayofWeek () et d'autres interfaces Testotherapis (); } / ** * Test "Field du calendrier" * * @param cal - objet calendrier * champ @param - "champ de calendrier" à tester. Peut être les valeurs suivantes: * calendar.year, calendar.month, calendar.date, ... etc * @param title - title * / private static void testSection (calendar cal, int champ, title de chaîne) {aléatoire final aléatoire = new random (); Date finale Date = Cal.getTime (); final int min = cal.getMinimum (champ); // Obtenez "Field Minimum Value" final int max = cal.getMaximum (champ); // Obtenez "Field MAXIMUM Valeur" final int réelmin = cal.getactualminimum (champ); // Obtenez "la valeur minimale du champ sous la date actuelle" final int réelmax = cal.getactualmaxim (champ); // Obtenez "la valeur maximale du champ sous la date actuelle" // Obtenez "la valeur actuelle du champ" final int ori = cal.get (champ); // Définissez "la valeur actuelle du champ" et obtenez "la valeur après le définition" final int r1 = random.nextint (max); cal.set (champ, r1); final int set = cal.get (champ); Essayez {// retourner "la valeur actuelle du champ": retournez entre "la valeur minimale du champ" et "la valeur maximale du champ". // "Valeur à rouleaux" peut être positif ou négatif. Cal.Roll (champ, -max); } catch (illégalargumentException e) {// Quand field == calendar.zone_offset, l'exception sera lancée! e.printStackTrace (); } final int roll = cal.get (champ); // Obtenez une valeur aléatoire final int signe = (random.nextint (2) == 1)? 1: -1; final int r2 = signe * random.nextint (max); Essayez {// Add "Valeur actuelle du champ" et obtenez "Nouvelle valeur de champ actuelle" // La "valeur du paramètre" de l'ajout peut être positive ou négative. Cal.Add (Field, R2); } catch (illégalargumentException e) {// Quand field == calendar.zone_offset, l'exception sera lancée! e.printStackTrace (); } final int add = cal.get (champ); // Imprimer le champ Information System.out.printf ("% s: / n / trang est [% d -% d] réel. } / ** * Test de "Interface de fonction publique du calendrier avec 17 champs" * / private static void testallcalendaSection () {// 00. ERA Field TestSection (calendar.getInstance (), calendar.era, "calendar.era"); // 01. Test-section sur le terrain de l'année (calendar.getInstance (), calendar.year, "calendar.year"); // 02. Mois TestSection sur le terrain (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 TestSection sur le terrain (calendar.getInstance (), calendar.week_of_month, "calendar.week_of_month"); // 05. Date TestSection sur le terrain (calendar.getInstance (), calendar.date, "calendar.date"); // 06. Day_of_month TestSection sur le terrain (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); // Is cal1 boolean earlier than cal2 isBefore = cal1.before(cal2); // Is cal1 later than cal2 boolean isAfter = cal1.after(cal2); // Compare cal1 and cal2 // (01) If cal1 is earlier than cal2, return -1 // (02) If cal1 is equal to cal2, return 0 // (03) If cal1 is later than cal2, return 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); } /** * Test Calendar's "Compare Interface" */ private static void testLenientAPIs() { Calendar cal = Calendar.getInstance(); // Get the default "tolerance". Return true boolean oriLenient = cal.isLenient(); // The MONTH value can only be "0-11", and the bounds are exceeded here. However, since cal is currently tolerant, the exception cal.set(Calendar.MONTH, 50); // Set "tolerance" to false. cal.setLenient(false); // Get the set "tolerance" boolean curLenient = cal.isLenient(); try { // The MONTH value can only be "0-11", and the bounds are exceeded here. Moreover, cal is currently intolerant, so an exception will occur. // However, the exception will not be thrown until the next time the date is calculated. That is, the exception is not thrown back in set(), but the exception is not thrown until get() is cal.set(Calendar.MONTH, 50); // At this time, read cal. Reading will cause the value of cal to be recalculated, so an exception is thrown at this time! int m2 = cal.get(Calendar.MONTH); } catch (IllegalArgumentException e) { e.printStackTrace(); } System.out.printf("/ntestLenientAPIs: oriLenient=%s, curLenient=%s/n", oriLenient, curLenient); } /** * Test Calendar's Date, TimeZone, MilliSecond and other related functions*/ private static void testTimeAPIs() { Calendar cal = Calendar.getInstance(); // Set the time zone of cal to "GMT+8" cal.setTimeZone(TimeZone.getTimeZone("GMT+8")); // Get the current cal time zone TimeZone timezone = cal.getTimeZone(); // Set milliseconds cal.setTimeInMillis(1279419645742l); // Get milliseconds long millis = cal.getTimeInMillis(); // After setting milliseconds, the time also changed. // Get the date corresponding to cal Date date = cal.getTime(); // Set the time to "1988-08-08" cal.set(1988, 08, 08); // Set the time to "1999-09-09 09:09" cal.set(1999, 09, 09, 9, 9); // Set the time to "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); } /** * Test Calendar's clone(), getFirstDayOfWeek() and other interfaces*/ private static void testOtherAPIs() { Calendar cal = Calendar.getInstance(); //Clone cal Calendar clone = (Calendar)cal.clone(); // Set to 2013-01-10. // Note: 2013-01-01 is "Tuesday", 2013-01-06 is "Sunday", clone.set(Calendar.YEAR, 2013); clone.set(Calendar.MONTH, 0); clone.set(Calendar.DATE, 10); // Set "The first week of this year contains at least 1 day". // Then 2013-01-10 belongs to the second week clone.setMinimalDaysInFirstWeek(1); int m1 = clone.getMinimalDaysInFirstWeek(); int index1 = clone.get(Calendar.WEEK_OF_YEAR); // Set "The first week of this year contains at least 7 days". // Then 2013-01-10 belongs to the first week clone.setMinimalDaysInFirstWeek(7); int m2 = clone.getMinimalDaysInFirstWeek(); int index2 = clone.get(Calendar.WEEK_OF_YEAR); // Set "What day of the week is the first day of the week". clone.setFirstDayOfWeek(Calendar.WEDNESDAY); // Get "What day of the week is the first day of the week". 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;/** * Some commonly used functions encapsulated according to Calendar's API*/public class CalendarSelfDefineTest { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); // Set the date to "2013-09-18" cal.set(2013, Calendar.SEPTEMBER, 18); // Get "year" System.out.printf("year: %s/n", getYear(cal) ); // Get "month" System.out.printf("month: %s/n", getMonth(cal) ); // Get "Last Month" System.out.printf("previcou month: %s/n", getLastMonth(cal) ); // Get "Next Month" System.out.printf("next month: %s/n", getNextMonth(cal) ); // Get "Day" System.out.printf("day: %s/n", getDay(cal) ); // Get Cal's corresponding weekly date System.out.printf("weekday: %s/n", getWeekDay(cal) ); // Number of days this month System.out.printf("Current Month days: %s/n", getMonthDays(cal) ); // Number of days last month System.out.printf("Previcous Month days: %s/n", getPrevMonthDays(cal) ); // Number of days next month System.out.printf("Next Month days: %s/n", getNextMonthDays(cal) ); // Get the day of the week of the first day of the month System.out.printf("First day' weekday: %s/n", getFirstDayWeekday(cal) ); // Get the day of the week of the first day of the month System.out.printf("First day' weekday: %s/n", getFirstDayWeekday(cal) ); // Get the week of the last day of the current month System.out.printf("Last day' weekday : %s/n", getLastDayWeekday(cal) ); // Get the week of the last day of the previous month System.out.printf("PrevMonth Last day' weekday: %s/n", getLastDayWeekdayOfPrevMonth(cal) ); // Get the week of the first day of the next month System.out.printf("NextMonth First day' weekday: %s/n", getFirstDayWeekdayOfNextMonth(cal) ); } /** * Get "year" * * @return For example, 2013-09-18, it returns 2013 */ public static int getYear(Calendar cal) { return cal.get(Calendar.YEAR); } /** * Get "month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, 2013-09-18, return 8 */ public static int getMonth(Calendar cal) { return cal.get(Calendar.MONTH); } /** * Get "Last month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, the last month of 2012-01-12 was "11" (i.e. DECEMBER). */ public static int getLastMonth(Calendar cal) { return (cal.get(Calendar.MONTH) + 11) % 12; } /** * Get "Next Month" * * @return The return value can be the following values: * JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER. * The first month of which is JANUARY, which is 0. * * For example, the next month on 2013-12-12 is "1" (i.e. DECEMBER). */ public static int getNextMonth(Calendar cal) { return (cal.get(Calendar.MONTH) + 13) % 12; } /** * Get "day" * * @return For example, 2013-09-18, it returns 18 * */ public static int getDay(Calendar cal) { return cal.get(Calendar.DATE); } /** * Get "days of this month" * * @return For example, 2013-09-18, it returns 30 * */ public static int getMonthDays(Calendar cal) { return cal.getActualMaximum(Calendar.DATE); } /** * Get "days in the previous month" * * @return For example, 2013-01-18, it returns 31 (because there are 31 days in 2012-12) * */ public static int getPrevMonthDays(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, cal tmpCal.add(Calendar.MONTH, -1); // Set to "Last month" return tmpCal.getActualMaximum(Calendar.DATE); } /** * Get "Number of days in the next month" * * @return For example, 2013-12-18, it returns 31 (because there are 31 days in 2014-01) * */ public static int getNextMonthDays(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.add(Calendar.MONTH, 1); // Set to "Next Month" return tmpCal.getActualMaximum(Calendar.DATE); } /** * Get the corresponding day of the week of Cal* * @return Return to "day of the week", which can be the following values: * SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY and SATURDAY. * SUNDAY is 1, MONDAY is 2, and so on. * For example, 2013-09-18 (Wednesday), return 4 */ public static int getWeekDay(Calendar cal) { return cal.get(Calendar.DAY_OF_WEEK); } /** * Get the corresponding day of the week on the first day of the month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getFirstDayWeekday(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the corresponding week day of the week on the last day of the current month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getLastDayWeekday(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month tmpCal.roll(Calendar.DATE, -1); // Set the date to the last day of the month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the week of the last day of the previous month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getLastDayWeekdayOfPrevMonth(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.set(Calendar.DATE, 1); // Set the date to the first day of the month tmpCal.add(Calendar.DATE, -1); // Set the date to the last day of the previous month return tmpCal.get(Calendar.DAY_OF_WEEK); } /** * Get the week offset of the first day of the next month* * @return SUNDAY is 1, MONDAY is 2, and so on. */ public static int getFirstDayWeekdayOfNextMonth(Calendar cal) { Calendar tmpCal = (Calendar)cal.clone(); // Clone cal. When facing the tmpCal operation later, the cal tmpCal.add(Calendar.MONTH, 1); // Set to "Next Month" tmpCal.set(Calendar.DATE, 1); // Set to "First Day" return tmpCal.get(Calendar.DAY_OF_WEEK); }}