Introducción a la primera parte
Definición del calendario:
El calendario de clase pública abstracta implementa serializable, clonable, comparable <calendar> {} El calendario puede considerarse como una clase abstracta.
Su implementación adopta el método de fábrica en el patrón de diseño. Se manifiesta en: cuando obtenemos la instancia del calendario, el calendario devolverá el objeto calendario correspondiente en función de los parámetros aprobados. Hay dos formas de obtener una instancia de calendario:
(1) Cuando obtenemos el calendario a través de calendario.getInstance (), el valor predeterminado es un objeto Gregoriancalendar devuelto.
Gregoriancalendar es una clase de implementación de calendario que proporciona un sistema de calendario estándar utilizado en la mayoría de los países del mundo.
(2) Cuando obtenemos el calendario a través del calendario.
Por ejemplo, si es Japón, se devuelve el objeto JapaneseMperialCalendar.
Consulte el siguiente código:
Public Static Calendar getInStance () {// Llame a CreateCalendar () para crear calendario calendario = CreateCalendar (TimeZone.getDefaultref (), locale.getDefault ()); Cal.sharedzone = verdadero; return cal;} public static calendar getInstance (TimeZone Zone) {// llamar createCalendar () para crear calendario return createCalendar (Zone, locale.getDefault ());} público estatic calendario (createAlTeDeFeDeFeDeFeDeFeDeFeDeFeDeTeGet (create Alocale); Cal.sharedzone = verdadero; return cal;} public static calendar getInstance (Timelone Zone, locale alocale) {// llamar createCalendar () para crear calendario return createCalendar (zona, alocale);} calendario estático privado createCalendar (zona de timón, locale alocale) {// (01) si la región es "th", the buddhacalendar /////////////us (02) (02) (02) es "JP", devuelve el objeto JapaneseImperialCalendar if ("th" .equals (alocale.getLanguage ()) && ("th" .equals (alocale.getCountry ()))) {return New Sun.util.BuddhistCalendar (Zone, Alocale); } else if ("jp" .equals (alocale.getVariant ()) && "jp" .equals (alocale.getCountry ()) && "ja" .equals (alocale.getLanguage ())) {return New JapaneseImperialCalendar (Zone, Alocale); } // (03) De lo contrario, devuelva el objeto Gregoriancalendar. devolver nuevo Gregoriancalendar (Zona, Alocale); }Después de obtener la instancia del calendario, podemos manipular el calendario a través de algunos métodos de columna proporcionados por el calendario.
Parte 2 Principios y pensamientos de calendario
Cuando usamos el calendario, no somos más que operar los campos del calendario "Año, mes, día, semana, hora, minuto y segundo" del calendario. A continuación, aprendemos los métodos de fuente, definición y cálculo de estos campos.
1. Calendario La fuente de cada valor de campo
Cuando usamos calendario, simplemente usamos información como "año, mes, día, semana, hora, minuto y segundo". Entonces, ¿cómo lo hizo? Esencialmente, el calendario ahorra un tiempo. La siguiente definición:
// El tiempo es la hora actual, en milisegundos. // Es la diferencia entre la distancia actual "1 de enero de 1970, 0:00:00 GMT". protegido mucho tiempo;
El calendario calcula información como "año, mes, día, día, semana, hora, minuto, segundo" según el tiempo.
2. Definición e inicialización de cada campo del calendario
La información del calendario "Año, mes, día, semana, hora, minuto y segundo" tiene un total de 17 campos.
Usamos calendario, que no es más que estos 17 campos. Sus definiciones son las siguientes:
(Campo 0) Público Final Static int ERA = 0;
Descripción: Era.
Valor: solo puede ser 0 o 1. 0 significa BC ("antes de Cristo", es decir, BC), 1 significa AD (latín "Anno Domini", es decir, AD).
(Campo 1) Público Final estático intanee = 1;
Descripción: Año.
(Campo 2) Público final estático final int mes = 2;
Descripción: Valor mensual: puede ser enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre, Incimber.
El primer mes de esto es enero, que es 0.
(Campo 3) Público final estática int Week_of_year = 3;
Nota: La fecha actual corresponde a la semana del año. El valor para la primera semana del año es 1.
(Campo 4) Público final estática int Week_of_month = 4;
Nota: La fecha actual corresponde a la semana del mes. El valor para la primera semana de un mes es 1.
(Campo 5) Público Final Estático int fecha = 5;
Descripción: Día. El valor para el primer día de un mes es 1.
(Campo 5) Público final estática int day_of_month = 5;
Nota: igual que "fecha", significa "día".
(Campo 6) Público Final STICT int day_of_year = 6;
Nota: ¿A qué día corresponde la fecha actual de este año? El valor para el primer día del año es 1.
(Campo 7) Público final estática int day_of_week = 7;
Descripción: Qué día de la semana.
Valores: puede ser el domingo, lunes, martes, miércoles, jueves, viernes y sábado.
Entre ellos, el domingo es 1, el lunes es 2, y así sucesivamente.
(Campo 8) Público final estática int day_of_week_in_month = 8;
Descripción: Qué semana del mes actual.
Valores: Day_of_Month 1 a 7 siempre corresponden a Day_of_week_in_Month 1; 8 a 14 siempre corresponden a Day_of_Week_in_Month 2, y así sucesivamente.
(Campo 9) Público final estático final int am_pm = 9;
Descripción: Valor de la mañana o de la tarde: puede ser AM o PM. AM es 0, indicando la mañana; PM es 1, que indica la tarde.
(Campo 10) Público Final Final Static Int Hour = 10;
Descripción: Indica la hora del día.
La hora se usa para relojes de 12 horas (0 - 11). El mediodía y la medianoche están representados por 0, no 12.
(Campo 11) Público final estático int hour_of_day = 11;
Descripción: Indica la hora del día.
Hour_of_day se usa para reloj las 24 horas. Por ejemplo, en el momento de 10: 04: 15.250 pm, Hour_of_day es 22.
(Campo 12) Público final estático final int mind = 12;
Descripción: ¿Qué minuto de una hora?
Por ejemplo, en el momento de 10: 04: 15.250 pm, el minuto es 4.
(Campo 13) Público Final Estático int Second = 13;
Descripción: Qué segundo en un minuto.
Por ejemplo, en el momento de 10: 04: 15.250 pm, el segundo es 15.
(Campo 14) Público Final Static int milisecond = 14;
Descripción: Qué milisegundos de un segundo.
Por ejemplo, en el momento de 10: 04: 15.250 pm, el milisegundo es 250.
(Campo 15) Público final estático intenchone_offset = 15;
Nota: Millisegunds indica el desplazamiento aproximado de GMT.
(Campo 16) Público Final Estático int dst_offset = 16;
Descripción: MilliseConds indica la compensación del tiempo de ahorro de verano.
Public final static int field_count = 17;
Estos 17 campos se guardan en la matriz int. La definición es la siguiente:
// Guardar la matriz de estos 17 campos protegidos con los campos int []; // El calendario protegido de la función de definición de la matriz (zona de zona horaria, locale alocale) {// inicialice los campos de "matriz de campos" = new int [field_count]; isset = new Boolean [field_count]; sell = new int [field_count]; this.zone = Zone; setWeekCountData (Alocale);}Calendario protegido (zona horaria, localidad alocale) Este es el constructor del calendario. Será llamado por su constructor de subclase, creando así una nueva variedad de "Guardar 17 datos de campo de calendario".
3. Calendario Calendario El cálculo de cada valor de campo
Tomemos Get (Int Field) como un ejemplo para explicar brevemente el cálculo y la operación de los 17 campos del calendario. get (int campo) es obtener el valor del campo "campo". Su definición es la siguiente:
public int get (int campo) {// Calcule los valores de cada campo completo (); // Devuelve el valor del campo de retorno de campo de campo (campo);} Nota: El código de get (int campo) es muy simple. Primero, calcule los valores de cada campo a través de completo () y luego devuelva "el valor del campo de campo" a través de un interno (campo).
La función de completo () es calcular los valores de cada campo del calendario. Se define en calendar.java, el código es el siguiente:
protegido void completo () {if (! istimeset) updateTime (); if (! arfieldsset || // Completa los campos unset AreeallFieldsSet = arfieldsset = true; }} private void updateTime () {CompuTetime (); istimeset = true;} updateTime () El CompuTetime () llamado se define en la clase de implementación de Calendar.java. A continuación, enumero la implementación de CompuTETime () en Gregoriancalendar.java: protegido Void CompuTETime () {// en modo no solo, realice una verificación breve de los campos de calendario // que se han establecido externamente. A través de esto // comprobación, los valores de campo se almacenan en OriginalFields [] // para ver si alguno de ellos se normaliza más adelante. if (! islenient ()) {if (originalfields == null) {originalfields = new int [field_count]; } for (int campo = 0; campo <field_count; field ++) {int value = internalget (campo); if (isExternallySet (Field)) {// Validación rápida para cualquier valor fuera de rango if (valor <getMinimum (campo) || valor> getMaximum (campo)) {arrojar nuevo IllegalArgumentException (getFieldName (Field)); }} originalfields [campo] = valor; }} // deja que la súper clase determine qué campos de calendario se utilizarán // para calcular el tiempo. int fieldmask = selectFields (); // El año predeterminado al inicio de la época. No verificamos // Fieldmask durante el año porque el año es un campo obligatorio para // determinar la fecha. int año = isset (año)? Internalget (año): EPOCH_YEAR; int ERA = internalgerA (); if (ERA == BCE) {año = 1 - año; } else if (ERA! = CE) {// Incluso en modo indulgente, rechazamos los valores de la era distintos de CE & BCE. // (la misma regla de normalización que add ()/roll () podría ser // aplicada aquí en modo indulgente. Pero esta verificación se mantiene // sin cambios para la compatibilidad a partir de 1.5). Lanzar nueva IllegalArgumentException ("Era inválida"); } // Si el año es 0 o negativo, necesitamos establecer el valor de la era más tarde. if (año <= 0 &&! Isset (ERA)) {FieldMask | = ERA_MASK; setFieldsComputed (ERA_MASK); } // Calcule la hora del día. Confiamos en la convención de que // un campo unset tiene 0. Tiempo de tiempo largo = 0; if (isFieldSet (FieldMask, Hour_of_day)) {TimeOfday += (Long) Internalget (Hour_of_Day); } else {timeOfday += internalget (hora); // El valor predeterminado de AM_PM es 0 que designa AM. if (isfieldset (fieldMask, am_pm)) {timeOfday += 12 * internalget (am_pm); }} TIMEOFDAY *= 60; TimeOfday += internalget (minuto); Tiempo de tiempo de día *= 60; TimeOfday += internalget (segundo); Tiempo de tiempo de día *= 1000; TimeOfday += internalget (milisegundo); // Convierta la hora del día en la cantidad de días y el // Millisegund Offset a partir de la medianoche. Long FixedDate = TimeOfday / One_day; TimeOfday %= One_day; while (TimeOfday <0) {TimeOfday += One_day; --fixeddate; } // Calcule la fecha fija desde el 1 de enero del 1 (Gregorian). calculateFixedDate: {long gfd, jfd; if (año> gregoriCuToveryear && año> gregoriangeveryearjulian) {gfd = fixeddate + getFixedDate (gcal, año, fieldmask); if (gfd> = gregoriCuToverDate) {fixeddate = gfd; ruptar calculadofixeddate; } jfd = fixeddate + getFixedDate (getJuliancalendarSystem (), año, FieldMask); } else if (año <gregoriCuToverAar && año <gregoriangeCuteryearjulian) {jfd = fixeddate + getFixedDate (getJuliancalendarSystem (), año, Fieldmask); if (jfd <gregorianguToverDate) {fixeddate = jfd; ruptar calculadofixeddate; } gfd = fixeddate + getFixedDate (gcal, año, fieldmask); } else {gfd = fixeddate + getFixedDate (gcal, año, fieldmask); jfd = fixeddate + getFixedDate (getJuliancalendarSystem (), año, Fieldmask); } // Ahora tenemos que determinar qué fecha de calendario es. if (gfd> = gregoriCuToverDate) {if (jfd> = gregorianguToverDate) {fixeddate = gfd; } else {// La fecha está en un período "superpuesto". De ninguna manera // desambiguarlo. Determinarlo usando el // cálculo de fecha anterior. if (calsys == gcal || calsys == null) {fixeddate = gfd; } else {fixeddate = jfd; }}} else {if (jfd <gregorianguToverDate) {fixeddate = jfd; } else {// La fecha está en un período "faltante". if (! islenient ()) {tire nueva ilegalargumentException ("la fecha especificada no existe"); } // Tome la fecha de Julian para la compatibilidad, que // producirá una fecha gregoriana. fixDate = jfd; }}} // Millis representa el tiempo de pared local en milisegundos. Long Millis = (fixeddate - Epoch_offset) * One_day + TimeOfday; // Calcula el desplazamiento de la zona horaria y el desplazamiento DST. Hay dos potencial // ambigüedades aquí. Asumiremos un tiempo de cambio de 2:00 a.m. (tiempo de pared) // para fines de discusión aquí. // 1. La transición a DST. Aquí, un tiempo de diseño de 2:00 a.m. a 2:59 am // puede estar en estándar o en DST dependiendo. Sin embargo, las 2:00 am es una representación inválida // (la representación salta de 1:59:59 AM STD a 3:00:00 AM DST). // Asumimos el tiempo estándar. // 2. La transición fuera de DST. Aquí, un tiempo diseñado de 1:00 a.m. - 1:59 am // puede estar en estándar o DST. Ambas son representaciones válidas (el representante // salta de 1:59:59 DST a 1:00:00 ETS). // Nuevamente, asumimos el tiempo estándar. // Utilizamos el objeto TimeZone, a menos que el usuario haya establecido explícitamente los campos Zone_offset // o DST_OFFSET; Luego usamos esos campos. Zona de zona de tiempo = 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 (zona instancia de zonainfo) {((ZoneInfo) Zone) .getoffsetsBywall (milis, 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); }} // Ajuste los valores de desplazamiento de la zona horaria para obtener el tiempo UTC. Millis -= ZoneOffsets [0] + ZoneOffsets [1]; // Establecer el tiempo de este calendario en el tiempo de milisegundos = milis; int Mask = ComputeFields (FieldMask | GetSetStateFields (), tzMask); if (! islenient ()) {for (int field = 0; field <field_count; field ++) {if (! isExternallySet (campo)) {continuar; } if (originalFields [Field]! = Internalget (Field)) {// Restaurar los valores de campo originales System.ArrayCopy (OriginalFields, 0, Fields, 0, Fields.length); tirar nueva ilegalargumentException (getFieldName (campo)); }}} setFieldsNormalized (máscara);} A continuación, echemos un vistazo a la definición de Internalget (campo). como sigue:
protegido final int interanter (int field) {return Fields [campo];} A partir de esto, podemos ver que Get (Int Field) finalmente devuelve el valor a través de Internalget (campo int).
Internalget (campo int) realmente devuelve el elemento de campo en la matriz de campo. ¡Esto corresponde a los 17 elementos del calendario!
En resumen, lo que debemos entender es: el calendario calcula "año, mes, día, hora, minuto, segundo", etc., en función de un tiempo (milisegundos), para facilitar nuestras operaciones en "año, mes, día, hora, minuto, segundo", etc. A continuación, presentamos las funciones de operación relevantes proporcionadas por el calendario a continuación.
Interfaz de función del calendario de la Parte 3
1. Interfaz común de 17 campos de calendario
Estos 17 campos de calendario admiten la siguiente interfaz de función pública. Para ver ejemplos de uso de estas interfaces comunes, consulte la función testallCalendarsections () en el ejemplo de calendarTest.java.
(1) GetMaximum (campo int)
Función: Obtenga el "valor máximo del campo". Nota "Compare la diferencia entre TI y GetActualMaximum ()". Ejemplo: en términos del campo "mes". Cómo usarlo es:
// Obtener instancia de calendario calendario cal = calendar.getInstance (); // Obtener el valor máximo del mes int max = cal.getmaximum (calendar.month);
Para obtener el valor máximo de otros campos, solo necesita reemplazar el mes correspondiente en el ejemplo con otros nombres de campo.
(2) GetActualMaximum (campo int)
Función: Obtenga el "valor máximo de este campo en la fecha actual". Ejemplo: en términos del campo "mes". Cómo usarlo es:
// Obtener instancia de calendario calendario cal = calendar.getInstance (); // Obtenga el valor máximo del mes actual int max = cal.getActualMaximum (calendar.month);
Para obtener el valor máximo de otros campos, solo necesita reemplazar el mes correspondiente en el ejemplo con otros nombres de campo.
Nota: Compare la diferencia entre getActualMaximum () y getMaximum (). Consulte el ejemplo de comparación a continuación,
A. El "valor máximo de campo" obtenido por getMaximum () se refiere al "valor máximo de campo" obtenido en todas las fechas combinadas.
Por ejemplo, el propósito de GetMaximum (Calendar.Date) es "obtener el 'máximo del día'". Según todas las fechas, se obtiene un máximo de 31 días por mes. Por lo tanto, el valor de retorno de GetMaximum (Calendar.Date) es "31"!
B. getActualMaximum () obtiene el "valor máximo de este campo en la fecha actual".
Por ejemplo, cuando la fecha es 2013-09-01, GetActualMaximum (Calendar.Date) es obtener "máximo del día" y es "30". La fecha actual es septiembre y septiembre es de solo 30 días. Por lo tanto, el valor de retorno de GetActualMaximum (Calendar.Date) es "30"!
(3) GetMinimum (Field int)
Función: Obtenga el "valor mínimo del campo". Nota "Compare la diferencia entre TI y GetActualMinimum ()". Ejemplo: en términos del campo "mes". Cómo usarlo es:
// Obtener instancia de calendario calendario cal = calendario.getInstance (); // Obtener el valor mínimo del mes int min = cal.getminimum (calendario.month);
Para obtener el valor mínimo de otros campos, solo necesita reemplazar el mes correspondiente en el ejemplo con otros nombres de campo.
(4) getActualminimum (campo int)
Función: Obtenga el "valor mínimo de este campo en la fecha actual". Ejemplo: en términos del campo "mes". Método de uso: // Obtener instancia de calendario calendario cal = calendar.getInstance (); // Obtener el valor mínimo del mes int min = cal.getminimum (calendar.month);
Para obtener el valor mínimo de otros campos, solo necesita reemplazar el mes correspondiente en el ejemplo con otros nombres de campo.
Nota: en el calendario predeterminado de Java, aunque getMinimum () y getActualminimum () tienen diferentes significados; Sin embargo, sus valores de retorno son los mismos. Porque el valor predeterminado del calendario es devolver el objeto Gregoriancalendar, en Gregoriancalendar.java, getminimum () y getActualminimum () devuelve el mismo valor.
(5) Obtener (campo int)
Función: Obtenga el "valor actual del campo". Obtiene el valor actual del campo de campo. Ejemplo: en términos del campo "mes". El método de "obtener el valor actual del mes" es:
// Obtener instancia de calendario calendario cal = calendar.getInstance (); // Obtenga el valor de mes actual del "calendario cal" int mes = cal.get (calendar.month);
Para obtener el valor actual de otros campos, solo necesita reemplazar el mes correspondiente en el ejemplo con otros nombres de campo.
(6) establecer (campo int, valor int)
Función: Establezca el "valor actual del campo". Establezca el valor actual del campo de campo en el valor del valor: en términos del campo "mes". El método de "configurar el valor actual del mes" es:
// Obtener instancia de calendario calendario cal = calendario.getInstance (); // Establecer el valor de mes actual del "calendario cal" a 1988 cal.set (calendar.month, 1988);
ilustrar:
A. 1988 es el valor actual del mes que desea establecer. Este valor de configuración debe ser un entero.
B. Para establecer el valor actual de otros campos, solo necesita reemplazar el mes correspondiente en el ejemplo con otros nombres de campo.
(7) Agregar (campo int, valor int)
Función: Agregue un valor al "Valor actual del campo". Agregue un valor al valor actual del campo de campo. Ejemplo: en términos del campo "mes". El método es el siguiente:
// Obtener una instancia de calendario y establecer la fecha en el calendario "2013-09-01" cal = calendar.getInstance (); cal.set (calendar.year, 2013); cal.set (calendar.month, 8); cal.set (calendar.date, 1); // add -10 "cal.add (calendar.month, -10);
ilustrar:
A. -10 es el valor agregado.
El valor agregado puede ser un número positivo o negativo.
Un número positivo indica que la fecha aumenta y un número negativo indica que la fecha disminuye.
Asunción: ahora el valor de Cal es "2013-09-01", ahora aumentamos el valor del campo de mes -10. El resultado es: "2012-10-01".
¿Por qué está sucediendo esto? "2013-09-01" aumenta -10, lo que significa reducir la fecha hacia adelante en 10 meses; El resultado es "2012-10-01".
B. Entre los 17 campos del calendario: a excepción del calendario de rodar. Zone_offset, se lanzará una excepción de IllegalArgumentException; Otros campos apoyan esta operación.
C. Para establecer el valor actual de otros campos, solo necesita reemplazar el mes correspondiente en el ejemplo con otros nombres de campo.
(8) Rollo (campo int, valor int)
Función: Revuelve el ejemplo del "valor actual del campo": tome el campo "mes". El método de "volver al valor actual del mes" es:
// Obtenga una instancia de calendario y establezca la fecha en el calendario "2013-09-01" cal = calendar.getInstance (); cal.set (calendar.year, 2013); cal.set (calendar.month, 8); cal.set (calendar.date, 1); // "despliegue hacia adelante 10" cal.roll (calendar.month, -10);
ilustrar:
A. -10 es el valor de reversión.
Cuando el valor de reversión es un número negativo, significa rodar el campo actual hacia adelante;
Cuando el valor de reversión es un número positivo, significa rodar el campo actual hacia atrás.
Al revertir un campo en el calendario, ¡no cambie el campo más grande!
¡Esta es la diferencia base entre roll () y add ()! add () puede cambiar los campos más grandes, como "usar add () para modificar el campo 'mes', puede causar un cambio en el campo 'año'"; Pero Roll () no cambiará los campos más grandes, como "usar roll () para modificar el campo 'mes', no causará un cambio en el campo 'año'".
Asunción: ahora el valor de Cal es "2013-09-01", ahora aumentamos el valor del campo de mes -10. El resultado es: "2013-10-01".
¿Por qué está sucediendo esto? Esto se debe a que "reversión" significa "rodar de un lado a otro entre el mínimo y el máximo". En este ejemplo, el mes es septiembre, y la reversión anterior es 10, y el valor obtenido es octubre, pero Roll () no cambiará el campo "más grande que el mes", por lo que el campo del año no cambiará. Entonces, el resultado es "2013-10-01".
B. Entre los 17 campos del calendario: a excepción del calendario de rodar. Zone_offset, se lanzará una excepción de IllegalArgumentException; Otros campos apoyan esta operación.
C. Para establecer el valor actual de otros campos, solo necesita reemplazar el mes correspondiente en el ejemplo con otros nombres de campo.
(9) claro (campo int)
Función: Borre el "valor actual del campo". La llamada compensación en realidad establece el valor de "campo" en 0; Si el valor mínimo del campo es 1, se establece en 1. Ejemplo: en términos del campo "mes". El método del "mes claro" es:
// Obtener una instancia de calendario y establecer la fecha en el calendario de "septiembre" cal = calendar.getInstance (); cal.set (calendario.month, 9); // claro mescal.clear (calendar.month);
Para borrar otros campos, solo necesita reemplazar el mes correspondiente en el ejemplo con otros nombres de campo.
(10) ISSET (INT Field)
Función: Determine si se establece el "campo de campo". Si se llama a Clear (), el campo se convierte en "No hay estado establecido". Ejemplo: en términos del campo "mes". El método de "juzgar si el mes está establecido" es:
// Obtener instancia de calendario calendario cal = calendario.getInstance (); // determinar si el mes está configurado boolean bset = cal.isset (calendario.month);
Para determinar otros campos, solo necesita reemplazar el mes correspondiente en el ejemplo con otros nombres de campo.
2. Otras funciones del calendario
(1) Función de comparación de fechas
La función de comparación del calendario incluye principalmente lo siguiente:
// Compare si la fecha, la zona horaria y otro contenido del "objeto calendario actual" y el "calendario" son iguales. boolean iguales (objeto objeto) // si el objeto calendario actual es anterior al calendarboolean antes (calendario de objeto) // si el objeto calendario actual es más tardío que el calendarboolean después (calendario de objeto) // Compara "objeto calendario actual" y "calendario". // si es anterior al "calendario", return -1 // si es igual, regrese 0 // si es posterior al "calendario", return 1Int comparado (calendario otro calendario)
Para ver ejemplos de uso de estas funciones, consulte la función testComParatorApis () en el ejemplo de calendArtest.java.
Ejemplo: suponga que Cal1 y Cal2 son dos objetos de calendario.
// Sus métodos de uso son los siguientes boolean isequal = cal1.equals (cal2); boolean isbore = cal1.before (cal2); boolean isafter = cal1.after (cal2); int icompare = cal1.compareto (cal2);
(2) función de "tolerancia"
// Establecer "Tolerancia del calendario" Void setLenient (valor booleano) // Obtener "tolerancia calendario" boolean islenient ()
Para ver ejemplos de uso de estas funciones, consulte la función testLenientApis () en el ejemplo de calendArtest.java.
ilustrar:
El calendario tiene dos modos que interpretan los campos de calendario, a saber, indulgente y no suelto.
R. Cuando el calendario está en modo indulgente, puede aceptar valores dentro de un rango más grande que el rango de los campos de calendario que genera. Cuando el calendario recalcula los valores del campo del calendario para que estos valores sean devueltos por get (), todos los campos de calendario están normalizados.
Por ejemplo, Gregoriancalendar en modo Lenient interpreta el mes == enero, Day_of_month == 32 como el 1 de febrero.
B. Cuando el calendario está en modo no indicativo, si hay alguna inconsistencia en su campo de calendario, lanzará una excepción.
Por ejemplo, Gregoriancalendar siempre genera un valor Day_of_Month entre 1 y la duración del mes. Si se han establecido valores de campo fuera del rango, Gregoriancalendar en modo no leve lanza una excepción al calcular los valores de tiempo o campo calendario.
Nota: La excepción en el paso (02) no se lanzará cuando se use set (), pero solo se lanzará en funciones como get (), getTimeInmillis (), gettime (), add () y roll (). Porque SET () solo establece un indicador de modificación, y los métodos como get () causarán un recalculación de tiempo, ¡y se lanzará una excepción en este momento!
(3) "Año, mes, día, zona horaria, funciones de milisegundos
// establecer "año, mes, día", conjunto de vacío final (int año, mes, día, hora, hora, int segundo) // establecer "año, mes, día, hora, intento, segundo) // establecer" año, mes, mes, día, hora, minuto, segundo "Final void set (intane, mes, día, hora, minuto, segundo) // fecha correspondiente al calendario final de la fecha final () Obtenga la zona horaria correspondiente al calendario TimeZone getTimeZone () // Establezca la zona horaria correspondiente al calendario void setTimezone (TimeZone TimeZone) // Obtenga el valor de Milliscondes correspondiente al calendario, que es el Millisegunds de la distancia de "Fecha de corriente del calendario" desde el valor de "1970-01-01 0:00:00 GMT" Long Timeinmillis () Calendario nulo settiminmillis (largos milisegundos)
Para ver ejemplos de uso de estas funciones, consulte la función testtimeapis () en el ejemplo de calendarTest.java.
(4) Otras operaciones
// Clone Calendarobject Clone () // Obtener "¿Qué día de la semana es el primer día de la semana"? Por ejemplo, en los Estados Unidos, este día es el domingo, y en Francia, este día es el lunes. int getFirstdayOfWeek () // establece "¿Qué día de la semana es el primer día de la semana"? Por ejemplo, en los Estados Unidos, este día es el domingo, y en Francia, este día es el lunes. void setFirstdayOfWeek (int value) // Obtiene el número mínimo de días requeridos para la primera semana del año. Por ejemplo, si la primera semana contiene el primer día del primer mes del año, este método regresará 1. Si el número mínimo de días debe ser una semana completa, este método devuelve 7. int getMinimaldaysinfirstweek () // Establece el número mínimo de días requeridos para la primera semana del año, por ejemplo, si el primer semana contiene el primer día del año del año, este método es un valor de 1. Una semana completa, este método se llama con un valor de 7. Void setMinimaldaysinfirstweek (int -valor)
Para ver ejemplos de uso de estas funciones, consulte la función testotherapis () en el ejemplo de calendarTest.java.
PARTE 4 Ejemplo de uso del calendario
A continuación, aprendemos la API usando calendario a través de ejemplos. El código fuente de CalendArtest.java es el siguiente:
import java.util.date; import java.util.calendar; import java.util.timezone; import java.util.random; public class calendArtest {public static void main (string [] args) {// prueba la interfaz pública de calendar con 17 campos "testallcalendarsections (); // prueba la "interfaz comparativa" del calendario TestComParatorApis (); // prueba la "interfaz comparativa" del calendario testLenientApis (); // Prueba la fecha del calendario, la zona horaria, el milisegundo y otras funciones relacionadas testtimeapis (); // Prueba de calendario clon (), getFirstdayOfWeek () y otras interfaces testotherapis (); } /** * Prueba "Campo del calendario" * * * @param cal - objeto calendario * @param campo - "campo calendario" para ser probado. Pueden ser los siguientes valores: * calendar.year, calendar.month, calendar.date, ... etc * @param title - title */ private static void testSection (calendar cal, int campo, título de cadena) {final aleatoria final = new Random (); fecha final fecha = cal.gettime (); final int min = cal.getminimum (campo); // Obtener "Valor mínimo de campo" final int max = cal.getMaximum (campo); // Obtener "Valor máximo de campo" final int realMin = cal.getActualMinimum (campo); // Obtenga "el valor mínimo del campo en la fecha actual" final int realmax = cal.getActualMaximum (campo); // Obtenga "el valor máximo del campo en la fecha actual" // Obtener "el valor actual del campo" final int ori = cal.get (campo); // establece "El valor actual del campo" y obtenga "el valor después de configurar" final int r1 = random.nextint (max); cal.set (campo, R1); final int set = cal.get (campo); Pruebe {// retrocede "El valor actual del campo": vuelva entre "el valor mínimo del campo" y "el valor máximo del campo". // "valor de rodillo" puede ser positivo o negativo. cal.Roll (campo, -max); } Catch (ilegalArgumentException e) {// When Field == Calendar.zone_offset, ¡la excepción se lanzará! E.PrintStackTrace (); } final int roll = cal.get (campo); // obtener un valor aleatorio final int fir = (random.nextint (2) == 1)? 1: -1; final int r2 = firm * random.nextint (max); Pruebe {// Agregar "valor actual del campo" y obtenga "nuevo valor de campo actual" // El "valor de parámetro" de ADD puede ser positivo o negativo. Cal.add (campo, R2); } Catch (ilegalArgumentException e) {// When Field == Calendar.zone_offset, ¡la excepción se lanzará! E.PrintStackTrace (); } final int add = cal.get (campo); // Imprima el sistema de información de campo.out.printf ("%s:/n/trang es [%d -%d] real range es [%d -%d]. Original =%d, set (%d) =%d, roll (%d) =%d, add (%d) =%d/n", título, mínimo, máx. } / ** * Poner la "interfaz de función pública del calendario con 17 campos" * / private static void testAllCalEnderSections () {// 00. ERA TestSection (calendar.getInstance (), calendar.era, "calendar.era"); // 01. Año de prueba de prueba de campo (calendar.getInstance (), calendar.year, "calendar.year"); // 02. Mes de prueba de prueba de campo (calendar.getInstance (), calendario.month, "calendario.month"); // 03. Week_of_year TestSection de campo (calendar.getInstance (), calendar.week_of_year, "calendar.week_of_year"); // 04. Semana_of_month TestSection de campo (calendar.getInstance (), calendar.week_of_month, "calendar.week_of_month"); // 05. Fecha de prueba de prueba de campo (calendar.getInstance (), calendar.date, "calendar.date"); // 06. Day_of_month TestSection de campo (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); }}