Útmutató a java.util.GregorianCalendar webhelyhez

1. Bemutatkozás

Ebben az oktatóanyagban gyorsan bepillantunk a Gergely naptár osztály.

2. Gergely naptár

Gergely naptár az absztrakt osztály konkrét megvalósítása java.util.Naptár. Nem meglepő, hogy a Gergely-naptár a világon a legszélesebb körben használt polgári naptár.

2.1. Példány megszerzése

Két lehetőség áll rendelkezésre a példány megszerzésére Gergely naptár:Calendar.getInstance () és az egyik kivitelező használatával.

A statikus gyári módszerrel Calendar.getInstance () nem ajánlott megközelítés, mivel egy szubjektív példányt ad vissza az alapértelmezett területi beállításra.

Lehet, hogy a Buddhista naptár thai vagy JapaneseImperialCalendar Japán számára. A visszaküldött példány típusának ismerete a ClassCastException:

@Test (várható = ClassCastException.class) public void test_Class_Cast_Exception () {TimeZone tz = TimeZone.getTimeZone ("GMT + 9: 00"); Locale loc = new Locale ("ja", "JP", "JP"); Naptár naptár = Calendar.getInstance (loc); GregorianCalendar gc = (GregorianCalendar) naptár; }

A hét túlterhelt konstruktor egyikével inicializálhatjuk Naptár objektum vagy az alapértelmezett dátummal és idővel, az operációs rendszer területi beállításaitól függően, vagy megadhatunk dátum, idő, területi beállítás és időzóna kombinációját.

Értsük meg azokat a különböző konstruktorokat, amelyek segítségével a Gergely naptár objektum példányosítható.

Az alapértelmezett konstruktor inicializálja a naptárt az aktuális dátummal és idővel az operációs rendszer időzónájában és területi beállításában:

új Gergely-naptár ();

Megadhatjuk a év, hónap, dayOfMonth, hourOfDay, perc, és másodszor az alapértelmezett időzóna az alapértelmezett területi beállítással:

új Gergely-naptár (2018, 6, 27, 16, 16, 47);

Ne feledje, hogy nem kell megadnunk hourOfDay, minute és második mivel vannak más konstruktorok is ezek nélkül a paraméterek nélkül.

Átadhatjuk az időzónát paraméterként, hogy létrehozzunk egy naptárt ebben az időzónában az alapértelmezett területi beállításokkal:

új GregorianCalendar (TimeZone.getTimeZone ("GMT + 5: 30"));

Átadhatjuk a területi beállítást paraméterként, hogy létrehozzunk egy naptárt ebben a területi beállításban az alapértelmezett időzónával:

új GregorianCalendar (új locale ("en", "IN"));

Végül paraméterként átadhatjuk az időzónát és a területi beállításokat is:

új GregorianCalendar (TimeZone.getTimeZone ("GMT + 5: 30"), új Locale ("en", "IN"));

2.2. Új módszerek a Java 8 alkalmazással

A Java 8 segítségével új módszereket vezettek be Gergely naptár.

A tól től() metódus megkapja a Gergely naptár a ZonedDateTime objektum alapértelmezett területi beállításával.

Használata getCalendarType () megkaphatjuk a naptárpéldány típusát. A rendelkezésre álló naptártípusok: „gregory”, „buddhista” és „japán”.

Ezt használhatjuk például arra, hogy bizonyosodjunk meg egy bizonyos típusú naptárról, mielőtt továbblépnénk az alkalmazáslogikánkra:

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

Hívás toZonedDateTime () konvertálhatjuk a naptárobjektumot a-vá ZonedDateTime tárgy ami ugyanazt a pontot képviseli az idővonalon, mint ez Gergely naptár.

2.3. Dátumok módosítása

A naptár mezők a módszerekkel módosíthatók add (), tekercs() és készlet().

A add () A módszer lehetővé teszi számunkra, hogy időt adjunk a naptárhoz egy meghatározott egységben a naptár belső szabálykészlete alapján:

@Test public void test_whenAddOneDay_thenMonthIsChanged () {int finalDay1 = 1; int végHónapJul = 6; GregorianCalendar calendarExpected = új 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); }

Használhatjuk a add () módszer az idő levonására a naptárobjektumból:

@Test public void test_whenSubtractOneDay_thenMonthIsChanged () {int finalDay31 = 31; int végHónapMájus = 4; GregorianCalendar calendarExpected = új GregorianCalendar (2018, 5, 1); calendarExpected.add (Calendar.DATE, -1); assertEquals (calendarExpected.get (Calendar.DATE), finalDay31); assertEquals (calendarExpected.get (Calendar.MONTH), finalMonthMay); }

A. Végrehajtása add () A módszer a naptár ezredmásodpercének és minden mezőjének azonnali újraszámítását kényszeríti.

Vegye figyelembe, hogy a add () megváltoztathatja a magasabb naptári mezőket is (ebben az esetben MONTH).

A tekercs() metódus aláírt összeget ad hozzá a megadott naptármezőhöz anélkül, hogy a nagyobb mezőket megváltoztatná. Egy nagyobb mező nagyobb időegységet képvisel. Például, DAY_OF_MONTH nagyobb, mint ÓRA.

Lássunk egy példát a hónapok összesítésére.

Ebben az esetben, ÉV nagyobb mező nem növekszik:

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

Hasonlóképpen le tudjuk görgetni a hónapokat:

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

A naptármezőt közvetlenül a megadott értékre állíthatjuk készlet() módszer. A naptár milliszekundumokban megadott időértéke csak a következő híváskor kerül kiszámításra kap(), getTime (), add () vagy tekercs() készül.

Így több hívás készlet() ne indítson felesleges számításokat.

Lássunk egy példát, amely a hónap mezőt 3-ra (azaz áprilisra) állítja:

@Test public void test_setMonth () {GregorianCalendarExample calendarDemo = new GregorianCalendarExample (); GregorianCalendar calendarActual = új GregorianCalendar (2018, 6, 28); GregorianCalendar calendarExpected = új GregorianCalendar (2018, 6, 28); calendarExpected.set (Calendar.MONTH, 3); Várható dátum = naptárExpected.getTime (); assertEquals (várhatóDátum, calendarDemo.setMonth (calendarActual, 3)); }

2.4. Dolgozni vele XMLGregorianCalendar

A JAXB lehetővé teszi a Java osztályok leképezését XML ábrázolásokra. A javax.xml.datatype.XMLGregorianCalendar type segíthet az alapvető XSD séma típusok feltérképezésében, mint pl xsd: dátum, xsd: idő és xsd: dateTime.

Nézzünk meg egy példát, amelyből konvertálhatunk Gergely naptár írja be a XMLGregorianCalendar típus:

@Test public void test_toXMLGregorianCalendar () dobja a {GregorianCalendarExample calendarDemo = new GregorianCalendarExample () kivételt; DatatypeFactory datatypeFactory = DatatypeFactory.newInstance (); GregorianCalendar calendarActual = új GregorianCalendar (2018, 6, 28); GregorianCalendar calendarExpected = új GregorianCalendar (2018, 6, 28); Várható XMLGregorianCalendarXMLGregorianCalendar = datatypeFactory .newXMLGregorianCalendar (calendarExpected); assertEquals (várhatóXMLGregorianCalendar, alendarDemo.toXMLGregorianCalendar (calendarActual)); }

Miután a naptárobjektum lefordítva XML formátumba került, minden olyan felhasználási esetben felhasználható, amely dátum sorosítását igényli, például üzenetküldés vagy webszolgáltatási hívások esetén.

Lássunk egy példát arra, hogyan lehet konvertálni XMLGregorianCalendar írja be újra Gergely naptár:

@Test public void test_toDate () dobja a DatatypeConfigurationException {GregorianCalendar calendarActual = új GregorianCalendar (2018, 6, 28); DatatypeFactory datatypeFactory = DatatypeFactory.newInstance (); Várható XMLGregorianCalendarXMLGregorianCalendar = datatypeFactory .newXMLGregorianCalendar (calendarActual); várhatóXMLGregorianCalendar.toGregorianCalendar (). getTime (); assertEquals (calendarActual.getTime (), várhatóXMLGregorianCalendar.toGregorianCalendar (). getTime ()); }

2.5. Dátumok összehasonlítása

Használhatjuk a Naptár osztályok ” összehasonlítani() módszer a dátumok összehasonlítására. Az eredmény pozitív lesz, ha az alapdátum jövőben van, és negatív, ha az alapadatok a dátum múltján vannak, összehasonlítjuk:

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

2.6. Dátumok formázása

Konvertálhatunk Gergely naptár meghatározott formátumba a következők kombinációjával ZonedDateTime és DateTimeFormatter a kívánt eredmény eléréséhez:

@Test public void test_dateFormatdMMMuuuu () {String VárhatóDátum = új GregorianCalendar (2018, 6, 28) .toZonedDateTime () .format (DateTimeFormatter.ofPattern ("d MMM uuuu")); assertEquals ("2018. július 28.", várható dátum); }

2.7. Információk szerzése a naptárról

Gergely naptár számos get metódust biztosít, amelyek felhasználhatók a különféle naptárattribútumok lekérésére. Nézzük meg a különböző lehetőségeket:

  • getActualMaximum (int mező) a megadott naptármező maximális értékét adja vissza, figyelembe véve az aktuális időértékeket. A következő példa a (z) 30 értékét adja vissza DAY_OF_MONTH mező, mert júniusnak 30 napja van:
    GregorianCalendar naptár = új GregorianCalendar (2018, 5, 28); assertTrue (30 == naptár.getActualMaximum (naptár.DAY_OF_MONTH));
  • getActualMinimum (int mező) a megadott naptári mező minimális értékét adja vissza, figyelembe véve az aktuális időértékeket:
    GregorianCalendar naptár = új GregorianCalendar (2018, 5, 28); assertTrue (1 == calendar.getActualMinimum (naptár.DAY_OF_MONTH));
  • getGreatestMinimum (int mező) az adott naptármező legmagasabb minimális értékét adja vissza:
    GregorianCalendar naptár = új GregorianCalendar (2018, 5, 28); assertTrue (1 == calendar.getGreatestMinimum (naptár.DAY_OF_MONTH));
  • getLeastMaximum (int mező) Az adott naptármező legalacsonyabb maximális értékét adja eredményül. A DAY_OF_MONTH mezőben ez 28, mert februárnak csak 28 napja lehet:
    GregorianCalendar naptár = új GregorianCalendar (2018, 5, 28); assertTrue (28 == naptár.getLeastMaximum (naptár.DAY_OF_MONTH));
  • getMaximum (int mező) az adott naptármező maximális értékét adja vissza:
    GregorianCalendar naptár = új GregorianCalendar (2018, 5, 28); assertTrue (31 == calendar.getMaximum (naptár.DAY_OF_MONTH));
  • getMinimum (int mező) az adott naptármező minimális értékét adja vissza:
    GregorianCalendar naptár = új GregorianCalendar (2018, 5, 28); assertTrue (1 == calendar.getMinimum (naptár.DAY_OF_MONTH));
  • getWeekYear () az ezzel képviselt hét évét adja vissza Gergely naptár:
    GregorianCalendar naptár = új GregorianCalendar (2018, 5, 28); assertTrue (2018 == calendar.getWeekYear ());
  • getWeeksInWeekYear () visszaadja a hét évének heteinek számát a naptári évre:
    GregorianCalendar naptár = új GregorianCalendar (2018, 5, 28); assertTrue (52 == calendar.getWeeksInWeekYear ());
  • isLeapYear () igaz, ha az év szökőév:
    GregorianCalendar naptár = új GregorianCalendar (2018, 5, 28); assertTrue (false == calendar.isLeapYear (calendar.YEAR));

3. Következtetés

Ebben a cikkben a Gergely naptár.

Mint mindig, a mintakód elérhető a GitHubon.