Sprievodca po java.util.GregorianCalendar

1. Úvod

V tomto výučbe sa krátko pozrieme na Gregoriánsky kalendár trieda.

2. Gregoriánsky kalendár

Gregoriánsky kalendár je konkrétna implementácia abstraktnej triedy java.util.Calendar. Nie je prekvapením, že gregoriánsky kalendár je najpoužívanejší civilný kalendár na svete.

2.1. Získanie inštancie

Existujú dve možnosti, ako získať inštanciu Gregoriánsky kalendár:Calendar.getInstance () a pomocou jedného z konštruktorov.

Použitie statickej továrenskej metódy Calendar.getInstance () nie je odporúčaný prístup, pretože vráti inštanciu subjektívne do predvoleného miestneho nastavenia.

Môže sa vrátiť a Budhistický kalendár pre thajské alebo Japonský cisársky kalendár pre Japonsko. Nepoznanie typu vrátenej inštancie môže viesť k a ClassCastException:

@Test (očakáva sa = ClassCastException.class) public void test_Class_Cast_Exception () {TimeZone tz = TimeZone.getTimeZone ("GMT + 9: 00"); Locale loc = new Locale ("ja", "JP", "JP"); Calendar calendar = Calendar.getInstance (loc); GregorianCalendar gc = (GregorianCalendar) kalendár; }

Pomocou jedného zo siedmich preťažených konštruktorov môžeme inicializovať Kalendár objekt buď s predvoleným dátumom a časom v závislosti od miestneho nastavenia nášho operačného systému, alebo môžeme určiť kombináciu dátumu, času, miestneho nastavenia a časového pásma.

Poďme pochopiť rôzne konštruktory, pomocou ktorých a Gregoriánsky kalendár objekt je možné vytvoriť inštanciu.

Predvolený konštruktor inicializuje kalendár s aktuálnym dátumom a časom v časovom pásme a národnom prostredí operačného systému:

nový GregorianCalendar ();

Môžeme určiť rok, mesiac, dayOfMonth, hourOfDay, minútaa druhé pre predvolené časové pásmo s predvoleným miestnym nastavením:

nový GregorianCalendar (2018, 6, 27, 16, 16, 47);

Upozorňujeme, že nemusíme špecifikovať hourOfDay, minute a druhý pretože existujú ďalšie konštruktory bez týchto parametrov.

Časové pásmo môžeme odovzdať ako parameter na vytvorenie kalendára v tomto časovom pásme s predvoleným miestnym nastavením:

nový GregorianCalendar (TimeZone.getTimeZone ("GMT + 5: 30"));

Môžeme odovzdať miestne nastavenie ako parameter na vytvorenie kalendára v tomto miestnom nastavení s predvoleným časovým pásmom:

nový GregorianCalendar (nové miestne nastavenie ("en", "IN"));

Nakoniec môžeme ako parametre odovzdať časové pásmo aj miestne nastavenie:

nový GregorianCalendar (TimeZone.getTimeZone ("GMT + 5: 30"), nové miestne nastavenie ("en", "IN"));

2.2. Nové metódy v prostredí Java 8

S programom Java 8 boli zavedené nové metódy Gregoriánsky kalendár.

The od () metóda získa inštanciu Gregoriánsky kalendár s predvoleným miestnym nastavením z objektu ZonedDateTime.

Použitím getCalendarType () môžeme získať typ inštancie kalendára. Dostupné typy kalendárov sú „veľký“, „budhistický“ a „japonský“.

Môžeme to použiť napríklad na to, aby sme sa ubezpečili, že máme kalendár určitého typu, než prejdeme k našej aplikačnej logike:

@Test public void test_Calendar_Return_Type_Valid () {Calendar calendar = Calendar.getInstance (); assert ("gregory" .equals (calendar.getCalendarType ())); }

Telefonovanie toZonedDateTime () môžeme previesť objekt kalendára na a ZonedDateTime objekt ktorý predstavuje rovnaký bod na časovej osi ako tento Gregoriánsky kalendár.

2.3. Úpravy dátumov

Polia kalendára je možné upravovať pomocou metód pridať (), zvitok () a sada ().

The pridať () metóda nám umožňuje pridať čas do kalendára v určenej jednotke na základe internej sady pravidiel kalendára:

@Test public void test_whenAddOneDay_thenMonthIsChanged () {int finalDay1 = 1; int finalMonthJul = 6; GregorianCalendar calendarExected = nový GregorianCalendar (2018, 5, 30); calendarExpected.add (Calendar.DATE, 1); System.out.println (calendarExected.getTime ()); assertEquals (calendarExpected.get (Calendar.DATE), finalDay1); assertEquals (calendarExpected.get (Calendar.MONTH), finalMonthJul); }

Môžeme tiež použiť pridať () metóda na odpočítanie času od objektu kalendára:

@Test public void test_whenSubtractOneDay_thenMonthIsChanged () {int finalDay31 = 31; int finalMonthMay = 4; GregorianCalendar calendarExected = nový GregorianCalendar (2018, 5, 1); calendarExpected.add (Calendar.DATE, -1); assertEquals (calendarExpected.get (Calendar.DATE), finalDay31); assertEquals (calendarExpected.get (Calendar.MONTH), finalMonthMay); }

Vykonanie pridať () Táto metóda vynúti okamžitý prepočet milisekúnd kalendára a všetkých polí.

Všimnite si, že pomocou pridať () môže tiež zmeniť vyššie polia kalendára (v tomto prípade MESIAC).

The zvitok () metóda pridá podpísanú čiastku do zadaného poľa kalendára bez zmeny väčších polí. Väčšie pole predstavuje väčšiu jednotku času. Napríklad, DAY_OF_MONTH je väčšie ako HODINA.

Pozrime sa na príklad, ako zrolovať mesiace.

V tomto prípade, ROK väčšie pole sa nezvýši:

@Test public void test_whenRollUpOneMonth_thenYearIsUnchanged () {int rolledUpMonthJuly = 7, orginalYear2018 = 2018; GregorianCalendar calendarExected = nový GregorianCalendar (2018, 6, 28); calendarExposed.roll (Calendar.MONTH, 1); assertEquals (calendarExpected.get (Calendar.MONTH), rolledUpMonthJuly); assertEquals (calendarExpected.get (Calendar.YEAR), orginalYear2018); }

Podobne môžeme rolovať aj mesiace:

@Test public void test_whenRollDownOneMonth_thenYearIsUnchanged () {int rolledDownMonthJune = 5, orginalYear2018 = 2018; GregorianCalendar calendarExected = nový GregorianCalendar (2018, 6, 28); calendarExposed.roll (Calendar.MONTH, -1); assertEquals (calendarExpected.get (Calendar.MONTH), rolledDownMonthJune); assertEquals (calendarExpected.get (Calendar.YEAR), orginalYear2018); }

Môžeme priamo nastaviť pole kalendára na zadanú hodnotu pomocou sada () metóda. Hodnota času v kalendári v milisekundách sa neprepočíta do ďalšieho volania na dostať (), getTime (), pridať () alebo zvitok () je vyrobené.

Teda viac hovorov na sada () nespúšťajte zbytočné výpočty.

Pozrime sa na príklad, ktorý nastaví pole mesiac na 3 (t. J. Apríl):

@Test public void test_setMonth () {GregorianCalendarExample calendarDemo = nový GregorianCalendarExample (); GregorianCalendar calendarActual = nový GregorianCalendar (2018, 6, 28); GregorianCalendar calendarExected = nový GregorianCalendar (2018, 6, 28); calendarExposed.set (Calendar.MONTH, 3); Dátum očakávaDátum = kalendárOčakávané.getTime (); assertEquals (expectDate, calendarDemo.setMonth (calendarActual, 3)); }

2.4. Pracujúci s XMLGregorianCalendar

JAXB umožňuje mapovať triedy Java na reprezentácie XML. The javax.xml.datatype.XMLGregorianCalendar typ môže pomôcť pri mapovaní základných typov schém XSD ako napr xsd: dátum, xsd: čas a xsd: dateTime.

Pozrime sa na príklad, z ktorého môžeme konvertovať Gregoriánsky kalendár zadajte do XMLGregorianCalendar typ:

@Test public void test_toXMLGregorianCalendar () vyvolá výnimku {GregorianCalendarExample calendarDemo = nový GregorianCalendarExample (); DatatypeFactory datatypeFactory = DatatypeFactory.newInstance (); GregorianCalendar calendarActual = nový GregorianCalendar (2018, 6, 28); GregorianCalendar calendarExected = nový GregorianCalendar (2018, 6, 28); Očakáva sa XMLGregorianCalendarXMLGregorianCalendar = datatypeFactory .newXMLGregorianCalendar (calendarExposed); assertEquals (expectXMLGregorianCalendar, alendarDemo.toXMLGregorianCalendar (calendarActual)); }

Keď je objekt kalendára preložený do formátu XML, je možné ho použiť v akýchkoľvek prípadoch použitia, ktoré vyžadujú serializáciu dátumu, ako sú správy alebo volania webových služieb.

Pozrime sa na príklad, ako prevádzať z XMLGregorianCalendar napíš späť Gregoriánsky kalendár:

@Test public void test_toDate () hodí DatatypeConfigurationException {GregorianCalendar calendarActual = nový GregorianCalendar (2018, 6, 28); DatatypeFactory datatypeFactory = DatatypeFactory.newInstance (); XMLGregorianCalendar sa očakávaXMLGregorianCalendar = datatypeFactory .newXMLGregorianCalendar (calendarActual); expectXMLGregorianCalendar.toGregorianCalendar (). getTime (); assertEquals (calendarActual.getTime (), expectXMLGregorianCalendar.toGregorianCalendar (). getTime ()); }

2.5. Porovnávanie dátumov

Môžeme použiť Kalendár triedy ' porovnať s() metóda na porovnanie dátumov. Výsledok bude pozitívny, ak je základný dátum v budúcnosti, a negatívny, ak sú základné údaje z minulosti dátumu, ktorý porovnáme s:

@Test public void test_Compare_Date_FirstDate_Greater_SecondDate () {GregorianCalendar firstDate = nový GregorianCalendar (2018, 6, 28); GregorianCalendar secondDate = nový GregorianCalendar (2018, 5, 28); assertTrue (1 == firstDate.compareTo (secondDate)); } @Test public void test_Compare_Date_FirstDate_Smaller_SecondDate () {GregorianCalendar firstDate = nový GregorianCalendar (2018, 5, 28); GregorianCalendar secondDate = nový GregorianCalendar (2018, 6, 28); assertTrue (-1 == firstDate.compareTo (secondDate)); } @Test public void test_Compare_Date_Both_Dates_Equal () {GregorianCalendar firstDate = nový GregorianCalendar (2018, 6, 28); GregorianCalendar secondDate = nový GregorianCalendar (2018, 6, 28); assertTrue (0 == firstDate.compareTo (secondDate)); }

2.6. Dátumy formátovania

Môžeme prevádzať Gregoriánsky kalendár do konkrétneho formátu pomocou kombinácie ZonedDateTime a DateTimeFormatter získať požadovaný výstup:

@Test public void test_dateFormatdMMMuuuu () {String expectDate = new GregorianCalendar (2018, 6, 28) .toZonedDateTime () .format (DateTimeFormatter.ofPattern ("d MMM uuuu")); assertEquals („28. júla 2018“, očakávaný dátum); }

2.7. Získanie informácií o kalendári

Gregoriánsky kalendár poskytuje niekoľko metód get, ktoré možno použiť na načítanie rôznych atribútov kalendára. Pozrime sa na rôzne možnosti, ktoré máme:

  • getActualMaximum (int pole) vráti maximálnu hodnotu pre zadané pole kalendára pri zohľadnení aktuálnych časových hodnôt. Nasledujúci príklad vráti hodnotu 30 pre DAY_OF_MONTH pole, pretože jún má 30 dní:
    Kalendár GregorianCalendar = nový GregorianCalendar (2018, 5, 28); assertTrue (30 == calendar.getActualMaximum (calendar.DAY_OF_MONTH));
  • getActualMinimum (int) vráti minimálnu hodnotu pre zadané pole kalendára s prihliadnutím na hodnoty aktuálneho času:
    Kalendár GregorianCalendar = nový GregorianCalendar (2018, 5, 28); assertTrue (1 == calendar.getActualMinimum (calendar.DAY_OF_MONTH));
  • getGreatestMinimum (int pole) vráti najvyššiu minimálnu hodnotu pre dané pole kalendára:
    Kalendár GregorianCalendar = nový GregorianCalendar (2018, 5, 28); assertTrue (1 == calendar.getGreatestMinimum (calendar.DAY_OF_MONTH));
  • getLeastMaximum (int pole) Vráti najnižšiu maximálnu hodnotu pre dané pole kalendára. Pre DAY_OF_MONTH pole je to 28, pretože február môže mať iba 28 dní:
    Kalendár GregorianCalendar = nový GregorianCalendar (2018, 5, 28); assertTrue (28 == calendar.getLeastMaximum (calendar.DAY_OF_MONTH));
  • getMaximum (int pole) vráti maximálnu hodnotu pre dané pole kalendára:
    Kalendár GregorianCalendar = nový GregorianCalendar (2018, 5, 28); assertTrue (31 == calendar.getMaximum (calendar.DAY_OF_MONTH));
  • getMinimum (int pole) vráti minimálnu hodnotu pre dané pole kalendára:
    Kalendár GregorianCalendar = nový GregorianCalendar (2018, 5, 28); assertTrue (1 == calendar.getMinimum (calendar.DAY_OF_MONTH));
  • getWeekYear () vráti rok v týždni, ktorý predstavuje Gregoriánsky kalendár:
    Kalendár GregorianCalendar = nový GregorianCalendar (2018, 5, 28); assertTrue (2018 == calendar.getWeekYear ());
  • getWeeksInWeekYear () vráti počet týždňov v týždňovom roku pre kalendárny rok:
    Kalendár GregorianCalendar = nový GregorianCalendar (2018, 5, 28); assertTrue (52 == calendar.getWeeksInWeekYear ());
  • isLeapYear () vráti true, ak je rok priestupným rokom:
    Kalendár GregorianCalendar = nový GregorianCalendar (2018, 5, 28); assertTrue (false == calendar.isLeapYear (calendar.YEAR));

3. Záver

V tomto článku sme preskúmali určité aspekty Gregoriánsky kalendár.

Vzorový kód je ako vždy k dispozícii na stránkach GitHub.


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