Guide til java.util.GregorianCalendar

1. Introduksjon

I denne opplæringen skal vi ta en rask titt på Gregorianske kalender klasse.

2. Gregorianske kalender

Gregorianske kalender er en konkret implementering av den abstrakte klassen java.util.Kalender. Ikke overraskende er den gregorianske kalenderen den mest brukte sivile kalenderen i verden.

2.1. Få et tilfelle

Det er to alternativer tilgjengelig for å få en forekomst av Gregorianske kalender:Calendar.getInstance () og bruke en av konstruktørene.

Ved hjelp av den statiske fabrikkmetoden Calendar.getInstance () er ikke en anbefalt tilnærming da den vil returnere en forekomst som er subjektiv til standardområdet.

Det kan returnere en Buddhistkalender for Thai eller JapaneseImperialCalendar for Japan. Ikke å vite typen forekomsten som 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 hjelp av en av de syv overbelastede konstruktørene kan vi initialisere Kalender objekt enten med standarddato og -tid, avhengig av lokaliteten til operativsystemet vårt, eller vi kan spesifisere en kombinasjon av dato, tid, sted og tidssone.

La oss forstå de forskjellige konstruktørene som a Gregorianske kalender objektet kan instantiseres.

Standardkonstruktøren vil initialisere kalenderen med gjeldende dato og klokkeslett i tidssonen og stedet for operativsystemet:

ny gregoriansk kalender ();

Vi kan spesifisere year, month, dayOfMonth, hourOfDay, minute, og andre for standard tidssone med standard lokalitet:

nye gregorianske kalender (2018, 6, 27, 16, 16, 47);

Merk at vi ikke trenger å spesifisere hourOfDay, minutt og sekund som det er andre konstruktører uten disse parametrene.

Vi kan passere tidssonen som en parameter for å lage en kalender i denne tidssonen med standard lokalitet:

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

Vi kan overføre lokalområdet som en parameter for å opprette en kalender i dette stedet med standard tidssone:

ny gregoriansk kalender (ny lokal ("en", "IN"));

Til slutt kan vi sende både tidssonen og lokaliteten som parametere:

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

2.2. Nye metoder med Java 8

Med Java 8 har nye metoder blitt introdusert for Gregorianske kalender.

De fra() metoden får en forekomst av Gregorianske kalender med standardinnstillingen fra et ZonedDateTime-objekt.

Ved hjelp av getCalendarType () vi kan få typen kalenderforekomst. De tilgjengelige kalendertypene er 'gregory', 'buddhist' og 'japanese'.

Vi kan for eksempel bruke dette for å sikre at vi har en kalender av en bestemt type før vi går videre med applikasjonslogikken vår:

@Test offentlig ugyldig test_Calendar_Return_Type_Valid () {Kalenderkalender = Calendar.getInstance (); assert ("gregory" .equals (calendar.getCalendarType ())); }

Ringer toZonedDateTime () vi kan konvertere kalenderobjektet til et ZonedDateTime gjenstand som representerer samme punkt på tidslinjen som dette Gregorianske kalender.

2.3. Endring av datoer

Kalenderfeltene kan endres ved hjelp av metodene legge til(), rull() og sett().

De legge til() metoden lar oss legge til tid til kalenderen i en spesifisert enhet basert på kalenderens interne regelsett:

@Test offentlig ugyldig 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å bruke legge til() metode for å trekke tid fra kalenderobjektet:

@Test offentlig ugyldig 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); }

Gjennomføring av legge til() metoden tvinger en umiddelbar omberegning av kalenderens millisekunder og alle felt.

Merk at bruk av legge til() kan også endre de høyere kalenderfeltene (MÅNED i dette tilfellet).

De rull() metoden legger til et signert beløp i det angitte kalenderfeltet uten å endre de større feltene. Et større felt representerer en større tidsenhet. For eksempel, DAY_OF_MONTH er større enn TIME.

La oss se et eksempel på hvordan du ruller sammen måneder.

I dette tilfellet, ÅR å være et større felt vil ikke økes:

@Test offentlig ugyldig 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åte kan vi rulle ned måneder:

@Test offentlig ugyldig 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), rullet DownMonthJune); assertEquals (calendarExpected.get (Calendar.YEAR), orginalYear2018); }

Vi kan direkte angi et kalenderfelt til en spesifisert verdi ved hjelp av sett() metode. Kalenderens tidsverdi i millisekunder blir ikke beregnet på nytt før neste samtale til få(), getTime (), legge til() eller rull() er laget.

Dermed flere samtaler til sett() ikke utløse unødvendige beregninger.

La oss se et eksempel som vil sette månedsfeltet til 3 (dvs. april):

@Test offentlig ugyldig test_setMonth () {GregorianCalendarExample calendarDemo = new 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. Jobber med XMLGregorianCalendar

JAXB tillater kartlegging av Java-klasser til XML-representasjoner. De javax.xml.datatype.XMLGregorianCalendar type kan hjelpe til med å kartlegge de grunnleggende XSD-skjematypene som xsd: dato, xsd: tid og xsd: dateTime.

La oss se på et eksempel å konvertere fra Gregorianske kalender skriv inn i XMLGregorianCalendar type:

@Test offentlig ugyldig test_toXMLGregorianCalendar () kaster unntak {GregorianCalendarExample calendarDemo = new GregorianCalendarExample (); DatatypeFactory datatypeFactory = DatatypeFactory.newInstance (); GregorianCalendar calendarActual = ny GregorianCalendar (2018, 6, 28); GregorianCalendar calendarExpected = ny GregorianCalendar (2018, 6, 28); XMLGregorianCalendar forventet XMLGregorianCalendar = datatypeFactory .newXMLGregorianCalendar (kalenderforventet); assertEquals (forventetXMLGregorianCalendar, alendarDemo.toXMLGregorianCalendar (calendarActual)); }

Når kalenderobjektet er oversatt til XML-format, kan det brukes i alle brukstilfeller som krever en dato som skal serialiseres, for eksempel meldinger eller nettjenesteanrop.

La oss se et eksempel på hvordan du konverterer fra XMLGregorianCalendar skriv inn igjen Gregorianske kalender:

@Test offentlig ugyldig test_toDate () kaster DatatypeConfigurationException {GregorianCalendar calendarActual = new GregorianCalendar (2018, 6, 28); DatatypeFactory datatypeFactory = DatatypeFactory.newInstance (); XMLGregorianCalendar forventet XMLGregorianCalendar = datatypeFactory .newXMLGregorianCalendar (calendarActual); forventetXMLGregorianCalendar.toGregorianCalendar (). getTime (); assertEquals (kalenderActual.getTime (), forventetXMLGregorianCalendar.toGregorianCalendar (). getTime ()); }

2.5. Sammenligning av datoer

Vi kan bruke Kalender klasser ' sammenligne med() metode for å sammenligne datoer. Resultatet vil være positivt hvis basisdatoen er i fremtiden, og negativt hvis basisdataene ligger tidligere enn den datoen vi sammenligner med:

@Test offentlig ugyldig test_Compare_Date_FirstDate_Greater_SecondDate () {GregorianCalendar firstDate = new GregorianCalendar (2018, 6, 28); GregorianCalendar secondDate = ny GregorianCalendar (2018, 5, 28); assertTrue (1 == firstDate.compareTo (secondDate)); } @Test offentlig ugyldig test_Compare_Date_FirstDate_Smaller_SecondDate () {GregorianCalendar firstDate = new GregorianCalendar (2018, 5, 28); GregorianCalendar secondDate = ny GregorianCalendar (2018, 6, 28); assertTrue (-1 == firstDate.compareTo (secondDate)); } @Test offentlig ugyldig 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 av datoer

Vi kan konvertere Gregorianske kalender inn i et bestemt format ved å bruke en kombinasjon av ZonedDateTime og DateTimeFormatter for å få ønsket utgang:

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

2.7. Få informasjon om kalenderen

Gregorianske kalender gir flere få metoder som kan brukes til å hente forskjellige kalenderattributter. La oss se på de forskjellige alternativene vi har:

  • getActualMaximum (int-felt) returnerer maksimumsverdien for det angitte kalenderfeltet med tanke på gjeldende tidsverdier. Følgende eksempel vil returnere verdi 30 for DAY_OF_MONTH felt fordi juni har 30 dager:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (30 == calendar.getActualMaximum (kalender.DAY_OF_MONTH));
  • getActualMinimum (int-felt) returnerer minimumsverdien for det angitte kalenderfeltet med tanke på gjeldende tidsverdier:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (1 == calendar.getActualMinimum (calendar.DAY_OF_MONTH));
  • getGreatestMinimum (int-felt) returnerer den høyeste minimumsverdien for det gitte kalenderfeltet:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (1 == calendar.getGreatestMinimum (calendar.DAY_OF_MONTH));
  • getLeastMaximum (int-felt) Returnerer den laveste maksimale verdien for det gitte kalenderfeltet. For DAY_OF_MONTH felt dette er 28, fordi februar kan ha bare 28 dager:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (28 == calendar.getLeastMaximum (kalender.DAY_OF_MONTH));
  • getMaximum (int-felt) returnerer maksimumsverdien for det gitte kalenderfeltet:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (31 == calendar.getMaximum (calendar.DAY_OF_MONTH));
  • getMinimum (int-felt) returnerer minimumsverdien for det gitte kalenderfeltet:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (1 == calendar.getMinimum (kalender.DAY_OF_MONTH));
  • getWeekYear () returnerer ukeåret representert av dette Gregorianske kalender:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (2018 == calendar.getWeekYear ());
  • getWeeksInWeekYear () returnerer antall uker i ukeåret for kalenderåret:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (52 == calendar.getWeeksInWeekYear ());
  • isLeapYear () returnerer sant hvis året er et skuddår:
    GregorianCalendar kalender = ny GregorianCalendar (2018, 5, 28); assertTrue (false == calendar.isLeapYear (calendar.YEAR));

3. Konklusjon

I denne artikkelen utforsket vi visse aspekter av Gregorianske kalender.

Som alltid er eksempelkoden tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found