Parte um Introdução
Definição do calendário:
Classe de classe abstrata pública implementos serializáveis, clonáveis, comparáveis <Calendar> {} O calendário pode ser considerado uma classe abstrata.
Sua implementação adota o método da fábrica no padrão de design. Ele se manifesta: Quando obtemos a instância do calendário, o calendário retornará o objeto de calendário correspondente com base nos parâmetros passados. Existem duas maneiras de obter a instância do calendário:
(1) Quando obtemos o calendário através do calendário.getInstance (), o padrão é um objeto GregianCalendar devolvido.
GregoriaNCalendar é uma classe de implementação de calendário que fornece um sistema de calendário padrão usado na maioria dos países do mundo.
(2) Quando obtemos o calendário através do calendário.GetInstance (fuso horário do fuso, localidade de localidade) ou calendário.GetInstance (fuso horário do tempo) ou calendário.GetInstance (localidade local), ele retorna o "calendário usado pela zona de tempo correspondente (zona) ou região (local), etc.".
Por exemplo, se for o Japão, o objeto JapaneseimperialCalendar é retornado.
Consulte o seguinte código:
calendário estático público getInstance () {// Call createCalendar () para criar calendário do calendário = createCalendar (timezone.getdefaultref (), loce.getDefault ()); cal.sharedzone = true; retornar cal;} public estático calendário getInstance (zona do fuso horário) {// Call createCalendar () para criar o calendário Return CreateCalendar (zone, loce.getDault ());} public static calendar sTATINSTANCE (Locale alocale) {// CallEGalELeArna () para criar calendário calendário (locale alocale) {// CallEtEArna () para criar um calendário do calendário (localidade) {// CreateLeAnTar () para criar um calendário do calendário. alocale); cal.sharedzone = true; return cal;}public static Calendar getInstance(TimeZone zone, Locale aLocale){ // Call createCalendar() to create calendar return createCalendar(zone, aLocale);}private static Calendar createCalendar(TimeZone zone, Locale aLocale){ // (01) If the region is "th", return the BuddhaCalendar object// (02) If the region é "jp", ele retorna o objeto japonêsimperialcalendar se ("th" .equals (alocale.getlanguage ()) && ("th" .equals (alocale.getCountry ()))) {return sun.util.buddhistcalendar (zona, alocale); } else if ("jp" .equals (alocale.getvariant ()) && "jp" .equals (alocale.getCountry ())) && "JA" .equals (alocale.getLanguage ()))) {retorna o novo japonêsnperialCalendar (zona, alocale); } // (03) Caso contrário, retorne o objeto GregoriaCalendar. devolver o novo GregoriaCalendar (zona, alocale); }Depois de obter a instância do calendário, podemos manipular o calendário através de alguns métodos de coluna fornecidos pelo calendário.
Parte 2 Princípios e pensamentos de calendário
Quando usamos o calendário, nada mais do que operar os campos dos "ano, mês, dia, semana, hora, minuto e segundo" do calendário. Abaixo, aprendemos os métodos de origem, definição e cálculo desses campos.
1. Calendário a fonte de cada valor de campo
Quando usamos o calendário, simplesmente usamos informações como "ano, mês, dia, semana, hora, minuto e segundo". Então, como isso fez isso? Essencialmente, o calendário economiza um tempo. A seguinte definição:
// O tempo é o horário atual, em milissegundos. // É a diferença entre a distância atual "1 de janeiro de 1970, 0:00:00 GMT". protegido por muito tempo;
O calendário calcula informações como "ano do calendário, mês, dia, semana, hora, minuto, segundo" com base no prazo.
2. Definição e inicialização de cada campo de calendário
Informações "Ano, mês, dia, semana, hora, minuto e segunda" do calendário têm um total de 17 campos.
Usamos o calendário, que nada mais é do que esses 17 campos. Suas definições são as seguintes:
(Campo 0) public final estático int ERA = 0;
Descrição: Era.
Valor: pode ser apenas 0 ou 1.
(Campo 1) Public Final Static int ano = 1;
Descrição: Ano.
(Campo 2) Public Final Static Int Month = 2;
Descrição: Valor mensal: pode ser janeiro, fevereiro, março, abril, maio, junho, julho, agosto, setembro, outubro, novembro, dezembro, undecimber.
O primeiro mês disso é janeiro, que é 0.
(Campo 3) Public final static int week_of_year = 3;
Nota: A data atual corresponde à semana do ano. O valor para a primeira semana do ano é 1.
(Campo 4) Public final static int week_of_month = 4;
Nota: A data atual corresponde à semana do mês. O valor para a primeira semana de um mês é 1.
(Campo 5) Public Final Static Int Date = 5;
Descrição: Dia. O valor para o primeiro dia de um mês é 1.
(Campo 5) public final estático int dia_of_month = 5;
NOTA: O mesmo que "data", significa "dia".
(Campo 6) public final estático int dia_of_year = 6;
Nota: Em que dia a data atual corresponde a este ano? O valor para o primeiro dia do ano é 1.
(Campo 7) public final estático int dia_of_week = 7;
Descrição: Em que dia da semana.
Valores: pode ser domingo, segunda, terça, quarta, quinta, sexta e sábado.
Entre eles, o domingo é 1, segunda -feira é 2 e assim por diante.
(Campo 8) public final estático int dia_of_week_in_month = 8;
Descrição: Que semana do mês atual.
Valores: Day_of_month 1 a 7 sempre corresponde a Day_of_week_in_month 1; 8 a 14 sempre corresponde a Day_OF_WEEK_IN_MONTH 2 e assim por diante.
(Campo 9) Public final Static int am_pm = 9;
Descrição: Valor da manhã ou da tarde: pode ser AM ou PM. AM é 0, indicando manhã; PM é 1, indicando tarde.
(Campo 10) Public final estático int hour = 10;
Descrição: indica a hora do dia.
A hora é usada para relógios de 12 horas (0 - 11). Meio -dia e meia -noite são representados por 0, não 12.
(Campo 11) public final estático int hour_of_day = 11;
Descrição: indica a hora do dia.
Hour_of_day é usado para relógio de 24 horas. Por exemplo, no momento das 10: 04: 15h250, hour_of_day é 22.
(Campo 12) Public final estático int minuto = 12;
Descrição: Em que minuto de hora?
Por exemplo, no momento das 10: 04: 15h250, o minuto é 4.
(Campo 13) Public Final Static Int Second = 13;
Descrição: Que segundo em um minuto.
Por exemplo, no momento das 10: 04: 15.250, o segundo é 15.
(Campo 14) public final estático int milissegundo = 14;
Descrição: Quais milissegundos de segundo.
Por exemplo, no momento das 10: 04: 15.250, o milissegundo é 250.
(Campo 15) Public Final Static Int Zone_Offset = 15;
Nota: Os milissegundos indicam o deslocamento aproximado do GMT.
(Campo 16) Public final static int dst_offset = 16;
Descrição: milissegundos indicam o deslocamento do tempo de economia do dia.
public final static int field_count = 17;
Esses 17 campos são salvos na matriz int. A definição é a seguinte:
// Salvar a matriz desses 17 campos protegidos int campos []; // A função de definição da matriz Calendar (zona do fuso horário, alocale local) {// Initialize "campos Array" campos = new int [field_count]; isset = new boolean [field_count]; carimbo = new int [field_count]; this.Zone = Zone; setWeekCountData (alocale);}Calendário protegido (zona do fuso horário, alocale local) Este é o construtor do calendário. Ele será chamado por seu construtor de subclasse, criando assim uma nova matriz de "Save 17 Campo Data of Calendar".
3. Calendário Calendário O cálculo de cada valor de campo
Vamos tomar (INT Field) como exemplo para explicar brevemente o cálculo e a operação dos 17 campos do calendário. GET (INT Field) é obter o valor do campo "Campo". Sua definição é a seguinte:
public int get (campo int) {// calcule os valores de cada campo completo (); // Retorna o valor do campo Retorno internalget (campo);} NOTA: O código de get (INT Field) é muito simples. Primeiro, calcule os valores de cada campo através do completo () e retorne "o valor do campo do campo" através do InternGet (campo).
A função de completa () é calcular os valores de cada campo do calendário. Está definido no calendário.java, o código é o seguinte:
Void protegido complete () {if (! ISTimeSet) updateTime (); if (! arefieldsset ||! AreallfieldSset) {computefields (); // preenche os campos unset AreallfieldsSet = arefieldSset = true; }} private void updateTETime () {ComputETime (); ISTimeset = true;} updateTime () O ComputETime () chamado é definido na classe de implementação do calendário.java. Abaixo, listo a implementação do ComputETime () em Gregoriancalendar.java: Void ComputetETime () {// No modo não lenário, execute uma breve verificação de campos calendários // que foram definidos externamente. Através desta verificação //, os valores do campo são armazenados em campos originais [] // para ver se algum deles é normalizado posteriormente. if (! islenient ()) {if (originalfields == null) {originalfields = new int [field_count]; } para (int field = 0; campo <field_count; campo ++) {int value = internget (campo); if (isExternallySet (campo)) {// Validação rápida para qualquer valores fora do intervalo se (value <getminimum (campo) || valor> getMaximum (campo)) {lança nova ilegalArgumentException (getFieldName (campo)); }} originalfields [campo] = value; }} // Deixe a super classe determinar quais campos de calendário serem // usados para calcular o tempo. int fieldmask = selectfields (); // O ano padrão é o início do Epoch. Não verificamos // FieldMask para o ano porque o ano é um campo obrigatório para // determinar a data. int ano = isset (ano)? Internalget (ano): epoch_year; int ERA = internalgerera (); if (ERA == BCE) {ano = 1 - ano; } else if (ERA! = CE) {// Mesmo no modo branda, não perseguimos valores de ERA que não sejam CE & BCE. // (a mesma regra de normalização que add ()/roll () pode ser // aplicado aqui no modo brando. Mas essa verificação é mantida // inalterada para compatibilidade a partir de 1.5.) Lança nova ilegalArgumentException ("Era inválida"); } // Se o ano for 0 ou negativo, precisamos definir o valor da ERA posteriormente. if (ano <= 0 &&! ISSET (ERA)) {FieldMask | = ERA_MASK; setfieldscomputed (ERA_MASK); } // Calcule a hora do dia. Confiamos na convenção de que // um campo Unset possui 0. Long timeOfday = 0; if (isfieldset (fieldmask, hour_of_day)) {timeofday += (long) internalget (hour_of_day); } else {timeofday += internalget (hora); // O valor padrão de AM_PM é 0, que designa AM. if (isfieldset (fieldmask, am_pm)) {timeofday += 12 * internget (am_pm); }} timeofday *= 60; TimeOfday += Internalget (minuto); TimeOfday *= 60; TimeOfday += Internalget (segundo); TimeOfday *= 1000; TimeOfday += Internalget (milissegundos); // converte a hora do dia para o número de dias e o // com deslocamento de milissegundos a partir da meia -noite. Long fIllDate = TimeOfday / One_day; TimeOfday %= One_Day; while (TimeOfday <0) {timeOfday += One_day; --FixedDate; } // Calcule a data fixa desde 1º de janeiro de 1 (Gregorian). CalculeFixedDate: {Long GFD, JFD; if (ano> GregoriaNCUTOveryear && Ano> GregoriaCUtoveryearJulian) {gfd = fixoDDate + getFixedDate (gcal, ano, máscara de campo); if (gfd> = Gregoriancutoverdate) {fIlldate = gfd; interrupção calculadafixedDate; } jfd = fIllDate + getFixedDate (getJuliaCalendarSystem (), ano, máscara de campo); } else if (ano <gregoriancutoveryear && ano <gregoriancutoveryearjulian) {jfd = fixeddate + getfixedDate (getjuliancalendarSystem (), ano, máscara de campo); if (jfd <gregoriancutoverdate) {fixdate = jfd; interrupção calculadafixedDate; } gfd = fIllDate + getFixedDate (gcal, ano, máscara de campo); } else {gfd = fIlldate + getFixedDate (gcal, ano, máscara de campo); jfd = fixoDDate + getFixedDate (getJuliaCalendarSystem (), ano, máscara de campo); } // Agora temos que determinar qual é a data do calendário. if (gfd> = gregoriancutoverdate) {if (jfd> = gregoriancutoverdate) {fixodate = gfd; } else {// A data está em um período "sobreposto". De jeito nenhum // para desambiguar. Determine -o usando o cálculo da data anterior. if (calsys == gcal || calsys == null) {fIlldate = gfd; } else {fIllDate = jfd; }}} else {if (jfd <gregoriancutoverdate) {fixdate = jfd; } else {// A data está em um período "ausente". if (! islenient ()) {lança nova ilegalArgumentException ("a data especificada não existe"); } // Tome a data de Julian para compatibilidade, que // produzirá uma data gregoriana. fIllDate = jfd; }}} // millis representa o tempo de parede local em milissegundos. Millis longo = (fixo - epoch_offset) * One_day + TimeOfday; // Calcule o deslocamento do fuso horário e o deslocamento do DST. Existem duas ambiguidades em potencial // aqui. Assumiremos um tempo de alternância das 2:00 da manhã (tempo de parede) // para fins de discussão aqui. // 1. A transição para o DST. Aqui, um tempo projetado das 2:00 às 2:59 // pode estar no padrão ou no DST, dependendo. No entanto, 2:00 da manhã é uma representação inválida // (a representação salta das 13:59:59 DST às 3:00:00 DST). // Assumimos tempo padrão. // 2. A transição para fora do DST. Aqui, um tempo projetado de 1:00 - 1:59 // pode estar no padrão ou no DST. Ambas são representações válidas (o representante // salta de 1:59:59 DST para 1:00:00 STD). // Novamente, assumimos o tempo padrão. // Usamos o objeto do fuso horário, a menos que o usuário tenha definido explicitamente os campos zone_offset // ou dst_offset; Então usamos esses campos. Zona do fuso horário = 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 (zone 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] = internget (dst_offset); }} // Ajuste os valores de compensação do fuso horário para obter o tempo do UTC. milis -= zoneoffsets [0] + zoneoffsets [1]; // Defina o tempo deste calendário em milissegundos time = millis; int máscara = computefields (fieldmask | getSetStateFields (), tzMask); if (! islenient ()) {for (int field = 0; campo <field_count; field ++) {if (! isexternallyset (campo)) {continuação; } if (originalfields [campo]! = internalget (campo)) {// restauram o campo original de valores system.arraycopy (originalfields, 0, campos, 0, campos.length); lançar novas ilegalargumentException (getFieldName (campo)); }}} setfieldsNormalized (Mask);} Em seguida, vamos dar uma olhada na definição de Internalget (campo). do seguinte modo:
Final Int Internalget protegido (campo int) {Return Fields [Field];} A partir disso, podemos ver que o Get (INT Field) finalmente retorna o valor através do Internalget (campo int).
Internalget (campo int) realmente retorna o elemento de campo na matriz de campo. Isso corresponde aos 17 elementos do calendário!
Em suma, o que precisamos entender é: o calendário calcula "ano, mês, dia, hora, minuto, segundo" e assim por diante, com base em um horário (milissegundos), de modo a facilitar nossas operações em "ano, mês, dia, hora, minuto, segundo" e assim por diante. Abaixo, apresentamos as funções de operação relevantes fornecidas pelo calendário abaixo.
Interface da função do calendário da parte 3
1. Interface comum de 17 campos de calendário
Esses 17 campos de calendário suportam a seguinte interface de função pública. Para exemplos de uso dessas interfaces comuns, consulte a função TestAllCalendarsections () no exemplo calendartest.java.
(1) getMaximum (campo int)
Função: obtenha o "valor máximo do campo". Observe "Compare a diferença entre ele e getActualMaximum ()". Exemplo: em termos do campo "mês". Como usá -lo é:
// obtenha calendário do calendário calendário cal = calendar.getInstance (); // obtenha o valor máximo do mês int max = cal.getmaximum (calendar.month);
Para obter o valor máximo de outros campos, você só precisa substituir o mês correspondente no exemplo por outros nomes de campo.
(2) getActualMaximum (campo int)
Função: Obtenha o "valor máximo deste campo na data atual". Exemplo: em termos do campo "mês". Como usá -lo é:
// obtém o calendário da instância do calendário calendário = calendar.getInstance (); // obtenha o valor máximo do mês atual int max = cal.getActualMaximum (calendar.month);
Para obter o valor máximo de outros campos, você só precisa substituir o mês correspondente no exemplo por outros nomes de campo.
NOTA: Compare a diferença entre getActualMaximum () e getMaximum (). Consulte o exemplo de comparação abaixo,
A. O "Valor Máximo do Campo" obtido por getMaximum () refere -se ao "valor máximo de campo" obtido em todas as datas combinadas.
Por exemplo, o objetivo do getMaximum (calendar.date) é "obter o 'máximo do dia'". Com base em todas as datas, é obtido um máximo de 31 dias por mês. Portanto, o valor de retorno do getMaximum (calendário.date) é "31"!
B. getActualMaximum () obtém o "valor máximo desse campo na data atual".
Por exemplo, quando a data é 2013-09-01, GetActualMaximum (calendário.date) é obter "máximo do dia" e é "30". A data atual é de setembro e setembro é de apenas 30 dias. Portanto, o valor de retorno do getActualMaximum (calendário.date) é "30"!
(3) getminimum (campo int)
Função: obtenha o "valor mínimo do campo". Observe "Compare a diferença entre ele e getActualMinimum ()". Exemplo: em termos do campo "mês". Como usá -lo é:
// Obter calendário calendário calendário cal = calendar.getInstance (); // Obtenha o valor mínimo do mês int = cal.getminimum (calendar.month);
Para obter o valor mínimo de outros campos, você só precisa substituir o mês correspondente no exemplo por outros nomes de campo.
(4) getActualMinimum (campo int)
Função: Obtenha o "valor mínimo deste campo na data atual". Exemplo: em termos do campo "mês". Método de uso: // Obtenha o calendário da instância do calendário Cal = calendar.getInstance (); // obtenha o valor mínimo do mês int = cal.getminimum (calendar.month);
Para obter o valor mínimo de outros campos, você só precisa substituir o mês correspondente no exemplo por outros nomes de campo.
Nota: no calendário padrão de Java, embora getminimum () e getActualMinimum () tenham significados diferentes; No entanto, seus valores de retorno são os mesmos. Como o padrão do calendário é devolver o objeto GregorianCalendar, em Gregoriancalendar.java, getminimum () e getActualMinimum () retornar o mesmo valor.
(5) Get (INT Field)
Função: obtenha o "valor atual do campo". Obtém o valor atual do campo de campo. Exemplo: em termos do campo "mês". O método de "Get O valor atual do mês" é:
// Obter calendário calendário calendário cal = calendar.getInstance (); // Obtenha o valor do mês atual de "calendário cal" int mês = cal.get (calendar.month);
Para obter o valor atual de outros campos, você só precisa substituir o mês correspondente no exemplo por outros nomes de campo.
(6) Definir (campo int, int valor)
Função: defina o "valor atual do campo". Defina o valor atual do campo de campo como valor de valor: em termos do campo "mês". O método de "definir o valor atual do mês" é:
// obtém o calendário da instância do calendário calendário = calendar.getInstance (); // Defina o valor do mês atual do "calendário cal" de 1988 cal.set (calendar.month, 1988);
ilustrar:
A. 1988 é o valor atual do mês que você deseja definir. Esse valor de configuração deve ser um número inteiro.
B. Para definir o valor atual de outros campos, você só precisa substituir o mês correspondente no exemplo por outros nomes de campo.
(7) Adicionar (campo int, int valor)
Função: Adicione um valor ao "valor atual do campo". Adicione um valor ao valor atual do campo. Exemplo: em termos do campo "mês". O método é o seguinte:
// Obtenha a instância do calendário e defina a data como "2013-09-01" calendário cal = calendar.getInstance (); cal.set (calendar.year, 2013); cal.set (calendar.month, 8); calendário (calendário.date, 1);
ilustrar:
A. -10 é o valor agregado.
O valor agregado pode ser um número positivo ou negativo.
Um número positivo indica que a data é aumentada e um número negativo indica que a data diminui.
Suposição: Agora, o valor de Cal é "2013-09-01", agora aumentamos o valor do campo do mês -10. O resultado é: "2012-10-01".
Por que isso está acontecendo? "2013-09-01" aumenta -10, o que significa reduzir a data adiante em 10 meses; O resultado é "2012-10-01".
B. Entre os 17 campos do calendário: Exceto pelo calendário revertido.Zone_Offset, uma exceção ilegalArgumentException será lançada; Outros campos suportam esta operação.
C. Para definir o valor atual de outros campos, você só precisa substituir o mês correspondente no exemplo por outros nomes de campo.
(8) Roll (campo int, Int Value)
Função: Role de volta o exemplo "Valor atual do campo": pegue o campo "Mês". O método de "reverter o valor atual do mês" é:
// Obtenha a instância do calendário e defina a data como "2013-09-01" calendário cal = calendar.getInstance (); cal.set (calendário.year, 2013); cal.set (calendar.month, 8); calendário (calendário.date, 1);
ilustrar:
A. -10 é o valor da reversão.
Quando o valor da reversão é um número negativo, significa rolar o campo atual para a frente;
Quando o valor da reversão é um número positivo, significa rolar o campo atual para trás.
Ao reverter um campo no calendário, não mude o campo maior!
Esta é a diferença base entre roll () e add ()! add () pode alterar campos maiores, como "usando add () para modificar o campo 'mês', pode causar uma alteração no campo 'Ano'; Mas o roll () não alterará campos maiores, como "Usando roll () para modificar o campo 'Mês', não causará uma mudança no campo do 'ano'".
Suposição: Agora, o valor de Cal é "2013-09-01", agora aumentamos o valor do campo do mês -10. O resultado é: "2013-10-01".
Por que isso está acontecendo? Isso ocorre porque "reversão" significa "rolando entre o mínimo e o máximo". Neste exemplo, o mês é de setembro e a reversão anterior é de 10, e o valor obtido é outubro, mas o roll () não mudará o campo "maior que o mês", portanto o campo do ano não mudará. Portanto, o resultado é "2013-10-01".
B. Entre os 17 campos do calendário: Exceto pelo calendário revertido.Zone_Offset, uma exceção ilegalArgumentException será lançada; Outros campos suportam esta operação.
C. Para definir o valor atual de outros campos, você só precisa substituir o mês correspondente no exemplo por outros nomes de campo.
(9) Clear (campo int)
Função: limpe o "valor atual do campo". A chamada compensação realmente define o valor de "campo" para 0; Se o valor mínimo do campo for 1, ele será definido como 1. Exemplo: em termos do campo "mês". O método de "mês claro" é:
// Obtenha a instância do calendário e defina a data para o calendário "setembro" cal = calendar.getInstance (); cal.set (calendar.month, 9); // limpo me mês.clear (calendar.month);
Para limpar outros campos, você só precisa substituir o mês correspondente no exemplo por outros nomes de campo.
(10) ISSET (campo int)
Função: Determine se o “campo de campo” está definido. Se Clear () é chamado, o campo se tornará "nenhum estado definido". Exemplo: em termos do campo "mês". O método de "julgar se o mês está definido" é:
// obtém calendário de instância calendário calendário = calendar.getInstance (); // Determine se o mês está definido booleano bset = cal.isset (calendar.month);
Para determinar outros campos, você só precisa substituir o mês correspondente no exemplo por outros nomes de campo.
2. Outras funções do calendário
(1) Função de comparação de data
A função de comparação do calendário inclui principalmente o seguinte:
// Compare se a data, o fuso horário e outro conteúdo de "Objeto do Calendário atual" e "Calendário" são iguais. Boolean é igual (objeto) // se o objeto do calendário atual é anterior ao calendarboolean antes (calendário do objeto) // se o objeto atual do calendário é posterior que o calendário após (calendário do objeto) // compare "objeto atual do calendário atual" e "calendário". // Se antes do "calendário", retorne -1 // se for igual, retorne 0 // se depois "calendário", retorne 1int comparado a (calendário outro calendar)
Para obter exemplos de uso dessas funções, consulte a função testComparatorApis () no exemplo calendartest.java.
Exemplo: suponha que Cal1 e Cal2 sejam dois objetos de calendário.
// seus métodos de uso são os seguintes booleanos isequal = cal1.equals (cal2); boolean isbefore = cal1.be antes (cal2); boolean isafter = cal1.afor (cal2); int icompare = cal1.compareto (cal2);
(2) Função de "tolerância"
// Definir "tolerância ao calendário" void setlenient (valor booleano) // obtém "tolerância ao calendário" boolean islenient ()
Para obter exemplos de uso dessas funções, consulte a função testlenientapis () no exemplo calendaTest.java.
ilustrar:
O calendário possui dois modos que interpretam campos calendários, ou seja, brando e não lenente.
R. Quando o calendário está no modo brando, pode aceitar valores dentro de uma faixa maior do que a faixa de campos de calendário que gera. Quando o calendário recalcula os valores do campo do calendário para que esses valores sejam retornados por get (), todos os campos do calendário são normalizados.
Por exemplo, GregoriaNCalendar no modo indulgente interpreta mês == JANEIRO, DIAF_OF_MONTH == 32 como 1º de fevereiro.
B. Quando o calendário estiver no modo não lenente, se houver alguma inconsistência em seu campo calendário, ele lançará uma exceção.
Por exemplo, o GregoriaCalendar sempre gera um valor de dia_of_month entre 1 e a duração do mês. Se algum valor de campo fora do intervalo tiver sido definido, o GregoriaCalendar no modo não lenente lançará uma exceção ao calcular os valores do campo de tempo ou calendário.
Nota: A exceção na etapa (02) não será lançada ao usar set (), mas só será lançada em funções como get (), gettimeInmillis (), getTime (), add () e roll (). Porque o set () basta definir um sinalizador de modificação, e métodos como get () causarão recálculo de tempo, e uma exceção será lançada neste momento!
(3) "Ano, mês, dia, fuso horário, funções de milissegundos
// Defina "Ano, mês, dia," Void Final Set (int ano, mês, dia, hora, horário, int em segundo) // Defina "ano, mês, dia, horário, hora, Int Second) // Defina" ano, mês, dia, hora, minuto, data para o final do calendário (o ano final (dia, mês, dia, dia, minuto, segundo) //, date até a data para o calendário. Obtenha o fuso horário correspondente ao fuso horário do calendário getTimeZone () // Defina o fuso horário correspondente ao calendário Void SettimeZone (fuso horário) // Obtenha o valor milliscondes correspondentes ao calendário, que é o milissegundos da data de "calendário" de 1970-01-01 (0:00:00 Calendário void setTimeInmillis (milissegundos longos)
Para obter exemplos de uso dessas funções, consulte a função testtimeapis () no exemplo calendartartest.java.
(4) Outras operações
// clone calendarobject clone () // obtém "que dia da semana é o primeiro dia da semana". Por exemplo, nos Estados Unidos, este dia é domingo e, na França, este dia é segunda -feira. int getFirstdayofWeek () // Defina "que dia da semana é o primeiro dia da semana". Por exemplo, nos Estados Unidos, este dia é domingo e, na França, este dia é segunda -feira. Void setFirstdayofWeek (Int Value) // Obtém o número mínimo de dias necessários para a primeira semana do ano. For example, if the first week contains the first day of the first month of the year, this method will return 1. If the minimum number of days must be a full week, this method returns 7. int getMinimalDaysInFirstWeek()// Sets the minimum number of days required for the first week of the year, for example, if the first week contains the first day of the first month of the year, this method is called with a value of 1. If the minimum number of days must be Uma semana inteira, esse método é chamado com um valor de 7. Void SetminimaldaysInfirstWeek (Int Value)
Para obter exemplos de uso dessas funções, consulte a função testOterapis () no exemplo calendeartest.java.
Parte 4 Exemplo de uso do calendário
Abaixo, aprendemos a API usando o calendário por meio de exemplos. O código -fonte do calendaTest.java é o seguinte:
importar java.util.date; importar java.util.calendar; importar java.util.TimeZone; importar java.util.random; public class calendaTest {public static void main (string [] args) {// teste de função pública ") da 17 fields" TestallCalandarssetsensimentos; // TestComparatorApis () do calendário de teste (); // Testlenientapis () do calendário de teste (); // Data do calendário de teste, fuso horário, milissegundo e outras funções relacionadas testtimeapis (); // clone (), getfirstdayofweek () e outras interfaces testotherapis (); } /** * Teste "Campo do calendário" * * @param cal - objeto de calendário * @param Field - "Campo do calendário" a ser testado. Pode ser os seguintes valores: * calendário.year, calendário.month, calendar.date, ... etc * @param title - título */ private estático void testsection (calendário cal, campo int, título da string) {final aleatório aleatório = novo aleatório (); data final data = cal.gettime (); final int min = cal.getminimum (campo); // Obtenha "Valor mínimo de campo" final int max = cal.getMaximum (campo); // obtém "Valor máximo de campo" final mIN = cal.getActualMinimum (campo); // obtém "o valor mínimo do campo na data atual" final int realMax = cal.getActualMaximum (campo); // obtém "o valor máximo do campo na data atual" // obtém "o valor atual do campo" final intr ori = cal.get (campo); // Defina "o valor atual do campo" e obtenha "o valor após a definição de" final int r1 = aleatória.nextint (max); cal.set (campo, r1); final int set = cal.get (campo); tente {// reverte "o valor atual do campo": reverte entre "o valor mínimo do campo" e "o valor máximo do campo". // "Valor do rolo" pode ser positivo ou negativo. cal.roll (campo, -max); } catch (ilegalArgumentException e) {// Quando Field == calendar.Zone_Offset, a exceção será lançada! E.PrintStackTrace (); } final int roll = cal.get (campo); // Obtenha um valor aleatório final int signe = (Random.NextInt (2) == 1)? 1: -1; final int r2 = sinal * aleatória.nextInt (max); tente {// Adicione "Valor atual do campo" e obtenha "novo valor atual de campo" // o "Valor do parâmetro" de Add pode ser positivo ou negativo. cal.add (campo, r2); } catch (ilegalArgumentException e) {// Quando Field == calendar.Zone_Offset, a exceção será lançada! E.PrintStackTrace (); } final int add = cal.get (campo); // Print field information System.out.printf("%s:/n/trang is [%d - %d] actualRange is [%d - %d]. original=%d, set(%d)=%d, roll(%d)=%d, add(%d)=%d/n", title, min, max, actualMin, actualMax, ori, r1, set, -max, roll, r2, add); } / ** * Interface de função pública do calendário de teste com 17 campos " * / private estático void testallCalendarsections () {// 00. // 01. Ano Testsection Testsection (calendar.getInstance (), calendário.year, "calendário.year"); // 02. Month Campo Testsection (calendar.getInstance (), calendário.month, "calendar.month"); //0. // 04. WEEM_OF_MONTH TESTESTION TESTESTE (Calendar.getInstance (), calendar.week_of_month, "calendar.week_of_month"); // 05. Data de campo Testsection (calendar.getInstance (), calendário.date, "calendar.date"); // 0. // 07. // 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); }}