1. Váltás az Dateosztályról az Calendarosztályra

A programozók szerették az Dateosztályt az egyszerűsége és a Unix szabványok támogatása miatt, de mint tudod, minden rózsának megvan a maga tövise.

A programozók "okos" Dateosztályt akartak. És megkapták, amit akartak az osztály formájában Calendar. Úgy tervezték, hogy ne csak dátumokat tároljon, hanem nehéz műveleteket is végrehajtson a dátumokkal.

Az Calendarosztály teljes neve java.util.Calendar. Ne felejtse el hozzáadni az importálási utasításhoz, ha úgy dönt, hogy használja a kódjában.

CalendarEzzel a paranccsal hozhat létre objektumot:

Calendar date = Calendar.getInstance();

Az osztály statikus getInstance()metódusa az aktuális dátummal inicializált objektumot Calendarhoz létre . CalendarA kívánt naptár a programot futtató számítógép beállításai alapján készül el.

Pontosabban a naptár, amit kapsz... Ez azért van, mert az emberek a Földön nem korlátozódnak egyetlen naptárra. Ehelyett sokat használnak. És szinte mindegyik valamilyen valláshoz vagy országhoz kötődik. Az Calendarosztály közülük 3-at támogat:

Naptár Leírás
Gergely naptár Keresztény Gergely-naptár
Buddhista naptár Buddhista naptár
Japán császári naptár Japán császári naptár

De vannak kínai és arab naptárak is. Alapvetően az idővel dolgozni nem olyan egyszerű, mint amilyennek látszik.

A kínai naptárban a lecke írásakor az év hivatalosan 4716. És a muszlim naptár szerint az év 1398. Üdvözöllek a nagyvilágban, programozó barátom.

2. Naptárobjektum létrehozása

A Gergely-naptárt fogjuk használni, mivel ez a legelterjedtebb a világon. Legalábbis addig, amíg Kína meg nem vásárolja az Oracle-t, és a kínai naptárat nem teszi a fő naptárnak.

Bármilyen dátummal rendelkező naptárobjektumot létrehozhat egy ehhez hasonló utasítással:

Calendar date = new GregorianCalendar(year, month, day);

GregorianCalendarIgen, minden alkalommal írni kell . A helyett Calendarírhat is GregorianCalendar– ez is működni fog. De az írás csak Calendarrövidebb.

Az évet teljes egészében kell írni, pl. 2019 helyett nem írhat 19-et. A hónapok továbbra is nullától vannak számozva. De mint korábban, a hónap napjai nem nullától kezdődnek. Nerds!

Az idő és a dátum beállításához további argumentumként kell megadnia az időt:

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

Szükség esetén akár ezredmásodpercben is átadhatja. Ezek a paraméterek a másodpercek száma után.

3. Naptárobjektum megjelenítése a képernyőn

Ha egyszerűen kinyomtat egy naptárobjektumot a képernyőre, nem lesz nagyon elégedett az eredménnyel.

Kód
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Konzol kimenet
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

Itt érdemes szem előtt tartani, hogy a naptár egy naptár, nem pedig egy dátum : mindenféle beállítással rendelkezik, amelyek mind megjelennek a képernyőn.

Helyénvaló lenne egy SimpleDateFormatobjektumot használni a naptár megjelenítéséhez, de amíg nem tanulmányozzuk, használhatja ezt az életet.

Date date = calendar.getTime();

Egy Calendarobjektum könnyen objektummá alakítható Date, és már tudja, hogyan kell egy Dateobjektumot megjeleníteni. CalendarAz ehhez hasonló kóddal egy objektumot konvertálhat Date:

A módszer használatával getTime():

Kód Konzol kimenet
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Ez egészen más kérdés, nem?

4. Munka a dátum elemeivel

A dátum egy adott elemének (pl. év, hónap, ...) lekéréséhez az Calendarosztály rendelkezik a get()metódussal. Ez egyetlen módszer, de vannak paraméterei:

int month = calendar.get(Calendar.MONTH);

Ahol calendaregy Calendarváltozó, és MONTHaz osztály állandó mezője Calendar.

Az osztály egyik Calendarkonstans mezőjét argumentumként adjuk át a metódusnak get, és eredményül megkapjuk a kívánt értéket.

Példák

Kód Leírás
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


korszak (a közkorszak előtt vagy után)
év hónap
hónap
hónap napja

a hét napja
óra
perc
másodperc

Egy dátum elemének módosításához használja a setkövetkező módszert:

calendar.set(Calendar.MONTH, value);

Ahol calendaregy Calendarváltozó, és MONTHaz osztály állandó mezője Calendar.

Amikor metódussal dolgozik set, az osztály egyik Calendarkonstans mezőjét adja át első argumentumként, és az új értéket második argumentumként.

Példák

Kód Leírás
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


év = 2019
hónap = július (0-tól számozva)
4. nap
óra
perc
másodperc

Calendar5. Az osztály állandói

Az Calendarosztály állandó mezői nem korlátozódnak a dátum elemeinek elnevezésére szolgáló mezőkre. Úgy tűnik, minden alkalomra vannak mezők.

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

Például vannak állandó mezők, amelyek hónapokra utalnak:

És a hét napjai is:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

Nem sorolunk fel mindent. Csak nem akarjuk, hogy meglepődjön, ha ilyen állandókat lát a kódban.

A konstansok használata jobban olvashatóvá teszi a kódot, ezért a programozók ezeket használják. A hónapok nullától kezdődően vannak számozva az olvashatóság javítása érdekében. Vagy nem.

6. Dátum módosítása egy Calendarobjektumban

Az Calendarosztálynak van egy metódusa, amely lehetővé teszi, hogy intelligensebb módon kezelje a dátumot. Például hozzáadhat egy évet, egy hónapot vagy több napot egy dátumhoz. Vagy vigye el őket. Ezt a módszert hívják add(). A vele való munka így néz ki:

calendar.add(Calendar.MONTH, value);

Ahol calendaregy Calendarváltozó, és MONTHaz osztály állandó mezője Calendar.

Amikor a metódussal dolgozik add, az osztály egyik konstans mezőjét adja meg Calendarelső argumentumként, második argumentumként pedig a hozzáadandó új értéket.

Ez egy másik intelligens módszer. Lássuk, mennyire okos:

Kód
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Konzol kimenet
Fri Mar 01 00:00:00 EET 2019

Ez a módszer megérti, hogy 2019 februárjában csak 28 nap van, így az eredmény március 1.

Most vegyünk el 2 hónapot! Mit vegyünk? 2018. december 27.! Most ellenőrizzük.

Egy korábbi dátumot eredményező művelet végrehajtásához negatív értéket kell átadnia a metódusnak add():

Kód
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Konzol kimenet
Thu Dec 27 00:00:00 EET 2018

Működik!

Ez a módszer figyelembe veszi a hónapok és a szökőévek eltérő hosszát. Összességében remek módszer. Pontosan erre van szüksége a legtöbb programozónak, aki dátumokkal dolgozik.

7. Egy dátum gördülő elemei

De néha vannak olyan helyzetek, amikor nem akarjuk ezt az okos viselkedést, például a randevú egy részéhez szeretne valamit tenni anélkül, hogy minden máson változtatna.

Az osztály rendelkezik erre Calendara speciális módszerrel. roll()Aláírása olyan, mint a add()metódusé, de ez a metódus a dátumnak csak egy elemét változtatja meg, a többi változatlan marad.

Példa:

Kód
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Konzol kimenet
Fri Dec 27 00:00:00 EET 2019

Megváltoztattuk a hónapot, de az év és a dátum változatlan maradt.