Vejledning til java.util.GregorianCalendar

1. Introduktion

I denne vejledning tager vi et hurtigt kig på Gregoriansk kalender klasse.

2. Gregoriansk kalender

Gregoriansk kalender er en konkret implementering af den abstrakte klasse java.util.Kalender. Ikke overraskende er den gregorianske kalender den mest anvendte civile kalender i verden.

2.1. At få en forekomst

Der er to muligheder for at få en forekomst af Gregoriansk kalender:Calendar.getInstance () og ved hjælp af en af ​​konstruktørerne.

Brug af den statiske fabriksmetode Calendar.getInstance () er ikke en anbefalet tilgang, da den vil returnere en instans, der er subjektiv til standardsprog.

Det returnerer muligvis en Buddhistisk kalender til Thai eller JapanskImperialKalender til Japan. Ikke at kende typen af ​​den forekomst, der returneres, kan føre til en ClassCastException:

@Test (forventet = ClassCastException.class) offentlig ugyldig test_Class_Cast_Exception () {TimeZone tz = TimeZone.getTimeZone ("GMT + 9: 00"); Lokal loc = ny lokal ("ja", "JP", "JP"); Kalenderkalender = Calendar.getInstance (loc); GregorianCalendar gc = (GregorianCalendar) kalender; }

Ved hjælp af en af ​​de syv overbelastede konstruktører kan vi initialisere Kalender modsætter dig enten standarddatoen og -tidspunktet afhængigt af vores operativsystems lokalitet, eller vi kan angive en kombination af dato, klokkeslæt, lokalitet og tidszone.

Lad os forstå de forskellige konstruktører, hvormed a Gregoriansk kalender objekt kan instantieres.

Standardkonstruktøren initialiserer kalenderen med den aktuelle dato og tid i operativsystemets tidszone og lokalitet:

ny gregoriansk kalender ();

Vi kan specificere år, måned, dagOfMåned, timeOfDag, minut, og anden for standard tidszone med standard landestandard:

ny gregoriansk kalender (2018, 6, 27, 16, 16, 47);

Bemærk, at vi ikke behøver at specificere timeOfDay, minut og sekund da der er andre konstruktører uden disse parametre.

Vi kan videregive tidszonen som en parameter for at oprette en kalender i denne tidszone med standard locale:

ny gregoriansk kalender (TimeZone.getTimeZone ("GMT + 5:30"));

Vi kan videregive lokaliteten som en parameter for at oprette en kalender i denne lokalitet med standard tidszone:

ny gregoriansk kalender (ny lokalitet ("da", "IN"));

Endelig kan vi videregive både tidszonen og lokaliteten som parametre:

ny gregoriansk kalender (TimeZone.getTimeZone ("GMT + 5: 30"), ny lokalitet ("da", "IN"));

2.2. Nye metoder med Java 8

Med Java 8 er der introduceret nye metoder til Gregoriansk kalender.

Det fra() metoden får en forekomst af Gregoriansk kalender med standardsprog fra et ZonedDateTime-objekt.

Ved brug af getCalendarType () vi kan hente typen af ​​kalenderinstansen. De tilgængelige kalendertyper er 'gregory', 'buddhist' og 'japanese'.

Vi kan f.eks. Bruge dette for at sikre, at vi har en kalender af en bestemt type, inden vi går videre med vores applikationslogik:

@Test offentligt ugyldigt test_Calendar_Return_Type_Valid () {Kalenderkalender = Calendar.getInstance (); hævde ("gregory" .equals (calendar.getCalendarType ())); }

Ringer toZonedDateTime () vi kan konvertere kalenderobjektet til et ZonedDateTime objekt der repræsenterer det samme punkt på tidslinjen som dette Gregoriansk kalender.

2.3. Ændring af datoer

Kalenderfelterne kan ændres ved hjælp af metoderne tilføje(), rulle() og sæt().

Det tilføje() metode giver os mulighed for at tilføje tid til kalenderen i en bestemt enhed baseret på kalenderens interne regelsæt:

@Test offentligt ugyldigt test_whenAddOneDay_thenMonthIsChanged () {int finalDay1 = 1; int finalMonthJul = 6; GregorianCalendar calendarExpected = ny GregorianCalendar (2018, 5, 30); calendarExpected.add (Calendar.DATE, 1); System.out.println (calendarExpected.getTime ()); assertEquals (calendarExpected.get (Calendar.DATE), finalDay1); assertEquals (calendarExpected.get (Calendar.MONTH), finalMonthJul); }

Vi kan også bruge tilføje() metode til at trække tid fra kalenderobjektet:

@Test offentligt ugyldigt test_whenSubtractOneDay_thenMonthIsChanged () {int finalDay31 = 31; int finalMonthMay = 4; GregorianCalendar calendarExpected = ny GregorianCalendar (2018, 5, 1); calendarExpected.add (Calendar.DATE, -1); assertEquals (calendarExpected.get (Calendar.DATE), finalDay31); assertEquals (calendarExpected.get (Calendar.MONTH), finalMonthMay); }

Udførelse af tilføje() metode tvinger en øjeblikkelig genberegning af kalenderens millisekunder og alle felter.

Bemærk, at brug af tilføje() kan også ændre de højere kalenderfelter (MÅNED i dette tilfælde).

Det rulle() metode tilføjer et underskrevet beløb til det angivne kalenderfelt uden at ændre de større felter. Et større felt repræsenterer en større tidsenhed. For eksempel, DAY_OF_MONTH er større end TIME.

Lad os se et eksempel på, hvordan man ruller måneder op.

I dette tilfælde, ÅR at være et større felt øges ikke:

@Test offentlig ugyldighed test_whenRollUpOneMonth_thenYearIsUnchanged () {int rulletUpMonthJuly = 7, orginalYear2018 = 2018; GregorianCalendar calendarExpected = ny GregorianCalendar (2018, 6, 28); calendarExpected.roll (Calendar.MONTH, 1); assertEquals (calendarExpected.get (Calendar.MONTH), rulletUpMonthJuly); assertEquals (calendarExpected.get (Calendar.YEAR), orginalYear2018); }

På samme måde kan vi rulle ned måneder:

@Test offentlig ugyldighed test_whenRollDownOneMonth_thenYearIsUnchanged () {int rulletDownMonthJune = 5, orginalYear2018 = 2018; GregorianCalendar calendarExpected = ny GregorianCalendar (2018, 6, 28); calendarExpected.roll (Calendar.MONTH, -1); assertEquals (calendarExpected.get (Calendar.MONTH), rulletDownMonthJune); assertEquals (calendarExpected.get (Calendar.YEAR), orginalYear2018); }

Vi kan direkte indstille et kalenderfelt til en bestemt værdi ved hjælp af sæt() metode. Kalenderens tidsværdi i millisekunder beregnes ikke igen før det næste opkald til få(), getTime (), tilføje() eller rulle() er lavet.

Således flere opkald til sæt() udløser ikke unødvendige beregninger.

Lad os se et eksempel, der indstiller månedsfeltet til 3 (dvs. april):

@Test offentlig ugyldighed test_setMonth () {GregorianCalendarExample calendarDemo = ny GregorianCalendarExample (); GregorianCalendar calendarActual = ny GregorianCalendar (2018, 6, 28); GregorianCalendar calendarExpected = ny GregorianCalendar (2018, 6, 28); calendarExpected.set (Calendar.MONTH, 3); Dato expectDate = calendarExpected.getTime (); assertEquals (expectDate, calendarDemo.setMonth (calendarActual, 3)); }

2.4. Arbejder med XMLGregorianCalendar

JAXB tillader kortlægning af Java-klasser til XML-repræsentationer. Det javax.xml.datatype.XMLGregorianCalendar type kan hjælpe med at kortlægge de grundlæggende XSD-skematyper som f.eks xsd: dato, xsd: tid og xsd: dateTime.

Lad os se på et eksempel at konvertere fra Gregoriansk kalender skriv ind i XMLGregorianCalendar type:

@Test offentlig ugyldighed test_toXMLGregorianCalendar () kaster undtagelse {GregorianCalendarExample calendarDemo = new GregorianCalendarExample (); DatatypeFactory datatypeFactory = DatatypeFactory.newInstance (); GregorianCalendar calendarActual = ny GregorianCalendar (2018, 6, 28); GregorianCalendar calendarExpected = ny GregorianCalendar (2018, 6, 28); XMLGregorianCalendar forventes XMLGregorianCalendar = datatypeFactory .newXMLGregorianCalendar (kalenderExpected); assertEquals (forventetXMLGregorianCalendar, alendarDemo.toXMLGregorianCalendar (kalenderActual)); }

Når kalenderobjektet er blevet oversat til XML-format, kan det bruges i alle anvendelsestilfælde, der kræver, at en dato serieres, f.eks. Beskeder eller webtjenesteopkald.

Lad os se et eksempel på, hvordan man konverterer fra XMLGregorianCalendar skriv tilbage i Gregoriansk kalender:

@Test offentlig ugyldighed test_toDate () kaster DatatypeConfigurationException {GregorianCalendar calendarActual = ny GregorianCalendar (2018, 6, 28); DatatypeFactory datatypeFactory = DatatypeFactory.newInstance (); XMLGregorianCalendar forventes XMLGregorianCalendar = datatypeFactory .nyeXMLGregorianCalendar (kalenderActual); expectXMLGregorianCalendar.toGregorianCalendar (). getTime (); assertEquals (kalenderActual.getTime (), forventetXMLGregorianCalendar.toGregorianCalendar (). getTime ()); }

2.5. Sammenligning af datoer

Vi kan bruge Kalender klasser ' sammenligne med() metode til at sammenligne datoer. Resultatet vil være positivt, hvis basisdatoen er i fremtiden, og negativt, hvis basisdataene ligger tidligere i den dato, vi sammenligner dem med:

@Test offentlig ugyldig test_Compare_Date_FirstDate_Greater_SecondDate () {GregorianCalendar firstDate = ny GregorianCalendar (2018, 6, 28); GregorianCalendar secondDate = ny GregorianCalendar (2018, 5, 28); assertTrue (1 == firstDate.compareTo (secondDate)); } @Test offentlig ugyldighed test_Compare_Date_FirstDate_Smaller_SecondDate () {GregorianCalendar firstDate = ny GregorianCalendar (2018, 5, 28); GregorianCalendar secondDate = ny GregorianCalendar (2018, 6, 28); assertTrue (-1 == firstDate.compareTo (secondDate)); } @Test offentlig ugyldighed test_Compare_Date_Both_Dates_Equal () {GregorianCalendar firstDate = new GregorianCalendar (2018, 6, 28); GregorianCalendar secondDate = ny GregorianCalendar (2018, 6, 28); assertTrue (0 == firstDate.compareTo (secondDate)); }

2.6. Formatering af datoer

Vi kan konvertere Gregoriansk kalender i et specifikt format ved hjælp af en kombination af ZonedDateTime og DateTimeFormatter for at få det ønskede output:

@Test offentlig ugyldighed test_dateFormatdMMMuuuu () {String forventet dato = ny gregoriansk kalender (2018, 6, 28). TilZonedDateTime () .format (DateTimeFormatter.ofPattern ("d MMM uuuu")); assertEquals ("28. juli 2018", forventet dato); }

2.7. Få oplysninger om kalenderen

Gregoriansk kalender giver flere få metoder, der kan bruges til at hente forskellige kalenderattributter. Lad os se på de forskellige muligheder, vi har:

  • getActualMaximum (int-felt) returnerer den maksimale værdi for det angivne kalenderfelt under hensyntagen til de aktuelle tidsværdier. Følgende eksempel returnerer værdi 30 for DAY_OF_MONTH felt, fordi juni har 30 dage:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (30 == calendar.getActualMaximum (kalender.DAY_OF_MONTH));
  • getActualMinimum (int-felt) returnerer minimumsværdien for det angivne kalenderfelt under hensyntagen til de aktuelle tidsværdier:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (1 == calendar.getActualMinimum (kalender.DAY_OF_MONTH));
  • getGreatestMinimum (int-felt) returnerer den højeste minimumsværdi for det givne kalenderfelt:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (1 == calendar.getGreatestMinimum (kalender.DAY_OF_MONTH));
  • getLeastMaximum (int-felt) Returnerer den laveste maksimale værdi for det givne kalenderfelt. Til DAY_OF_MONTH felt er dette 28, fordi februar måske kun har 28 dage:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (28 == calendar.getLeastMaximum (kalender.DAY_OF_MONTH));
  • getMaximum (int-felt) returnerer den maksimale værdi for det givne kalenderfelt:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (31 == kalender.getMaksimum (kalender.DAG_OF_MÅNED));
  • getMinimum (int-felt) returnerer minimumsværdien for det givne kalenderfelt:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (1 == kalender.getMinimum (kalender.DAG_OF_MÅNED));
  • getWeekYear () returnerer ugeåret repræsenteret af dette Gregoriansk kalender:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (2018 == calendar.getWeekYear ());
  • getWeeksInWeekYear () returnerer antallet af uger i ugeåret for kalenderåret:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (52 == calendar.getWeeksInWeekYear ());
  • isLeapYear () returnerer sandt, hvis året er et skudår:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (false == kalender.isLeapYear (kalender.ÅR));

3. Konklusion

I denne artikel udforskede vi visse aspekter af Gregoriansk kalender.

Som altid er prøvekoden tilgængelig på GitHub.