1. Schakelen van de Dateklas naar de Calendarklas

Programmeurs hielden van de Dateklasse vanwege zijn eenvoud en ondersteuning voor Unix-standaarden, maar zoals je weet, heeft elke roos zijn doornen.

Programmeurs wilden een "slimme" Dateklas. En ze kregen wat ze wilden in de vorm van de Calendarklas. Het is bedacht als een manier om niet alleen datums op te slaan, maar ook om moeilijke bewerkingen met datums uit te voeren.

De volledige naam van de Calendarklasse is java.util.Calendar. Vergeet het niet toe te voegen aan een importstatement als u besluit het in uw code te gebruiken.

U kunt een Calendarobject maken met deze opdracht:

Calendar date = Calendar.getInstance();

De statische getInstance()methode van de Calendarklasse maakt een Calendarobject dat is geïnitialiseerd met de huidige datum. De gewenste kalender wordt gemaakt op basis van de instellingen van de computer waarop het programma draait.

Of beter gezegd, de kalender die je krijgt... Dat komt omdat mensen op aarde niet beperkt zijn tot één enkele kalender. In plaats daarvan gebruiken ze er veel. En bijna elk van hen wordt geassocieerd met een religie of land. De Calendarklas ondersteunt er 3:

Kalender Beschrijving
Gregoriaanse kalender Christelijke Gregoriaanse kalender
Boeddhistische kalender Boeddhistische kalender
Japanse keizerlijke kalender Japanse keizerlijke kalender

Maar er zijn ook Chinese en Arabische kalenders. Kortom, werken met tijd is niet zo eenvoudig als het lijkt.

In de Chinese kalender is het jaar officieel 4716 ten tijde van het schrijven van deze les. En volgens de islamitische kalender is het jaar 1398. Welkom in de grote wereld, mijn vriend, programmeur.

2. Een kalenderobject maken

We zullen de Gregoriaanse kalender gebruiken, omdat deze de meest voorkomende ter wereld is. Tenminste totdat China Oracle koopt en de Chinese kalender de belangrijkste maakt.

U kunt een kalenderobject met elke datum maken met behulp van een instructie als deze:

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

Ja, je moet GregorianCalendarelke keer schrijven. In plaats van Calendar, kun je ook schrijven GregorianCalendar- dat werkt ook. Maar schrijven Calendaris gewoon korter.

Het jaar moet voluit worden geschreven, je kunt bijvoorbeeld geen 19 schrijven in plaats van 2019. Maanden worden nog steeds genummerd vanaf nul. Maar zoals voorheen worden de dagen van de maand niet vanaf nul genummerd. Nerds!

Om zowel de tijd als de datum in te stellen, moet u de tijd doorgeven als aanvullende argumenten:

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

U kunt indien nodig zelfs in milliseconden passeren. Ze zijn de parameter na het aantal seconden.

3. Een kalenderobject op het scherm weergeven

Als je gewoon een kalenderobject op het scherm afdrukt, ben je niet erg tevreden met het resultaat.

Code
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Console-uitvoer
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=?]

Het ding om hier in gedachten te houden is dat een kalender een kalender is, geen datum : het heeft allerlei instellingen die allemaal op het scherm worden weergegeven.

Het zou juist zijn om een SimpleDateFormat​​object te gebruiken om een ​​kalender weer te geven, maar totdat we het bestuderen, kun je deze lifehack gebruiken.

Date date = calendar.getTime();

Een Calendarobject kan eenvoudig worden omgezet in een Dateobject en u weet al hoe u een Dateobject moet weergeven. U kunt code als deze gebruiken om een Calendar​​object te converteren naar een Date:

De methode gebruiken getTime():

Code Console-uitvoer
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Dat is toch iets heel anders, niet?

4. Werken met elementen van een datum

Om een ​​specifiek element van een datum te krijgen (bv. het jaar, de maand, ...), Calendarheeft de klas de get()methode. Het is een enkele methode, maar het heeft parameters:

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

Waar calendaris een Calendarvariabele en MONTHis een constant veld van de Calendarklasse.

U geeft een van de Calendarconstante velden van de klasse door als argument aan de getmethode en u krijgt de gewenste waarde als resultaat.

Voorbeelden

Code Beschrijving
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);


jaartelling (voor of na de gewone jaartelling)
jaar
maand
dag van de maand

dag van de week
uren
minuten
seconden

Gebruik de methode om een ​​element van een datum te wijzigen set:

calendar.set(Calendar.MONTH, value);

Waar calendaris een Calendarvariabele en MONTHis een constant veld van de Calendarklasse.

Wanneer u met setde methode werkt, geeft u een van de Calendarconstante velden van de klasse door als het eerste argument en de nieuwe waarde als het tweede argument.

Voorbeelden

Code Beschrijving
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());


jaar = 2019
maand = juli (genummerd vanaf 0)
4e dag
uren
minuten
seconden

5. Constanten van de Calendarklas

De constante velden van de Calendarklasse zijn niet beperkt tot die voor het benoemen van elementen van een datum. Er lijken velden te zijn voor elke gelegenheid.

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

Er zijn bijvoorbeeld constante velden om naar maanden te verwijzen:

En ook de dagen van de week:

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

We zullen niet alles opsommen. We willen gewoon niet dat je verrast bent als je constanten zoals deze in de code ziet.

Het gebruik van constanten maakt de code leesbaarder, daarom gebruiken de programmeurs ze. En maanden zijn ook genummerd vanaf nul om de leesbaarheid te verbeteren. Of niet.

Calendar6. De datum in een object wijzigen

De Calendarklas heeft een methode waarmee je op een intelligentere manier op een date kunt werken. U kunt bijvoorbeeld een jaar, een maand of meerdere dagen toevoegen aan een datum. Of haal ze weg. Deze methode wordt genoemd add(). Het werken ermee ziet er zo uit:

calendar.add(Calendar.MONTH, value);

Waar calendaris een Calendarvariabele en MONTHis een constant veld van de Calendarklasse.

Wanneer u met addde methode werkt, geeft u een van de Calendarconstante velden van de klasse door als het eerste argument en als het tweede argument — de nieuwe waarde die moet worden toegevoegd.

Dit is een andere intelligente methode. Laten we eens kijken hoe slim het is:

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Console-uitvoer
Fri Mar 01 00:00:00 EET 2019

Deze methode gaat ervan uit dat er slechts 28 dagen zijn in februari 2019, dus de resulterende datum is 1 maart.

Laten we nu 2 maanden wegnemen! Wat moeten we krijgen? 27 december 2018! Laten we nu kijken.

Om een ​​bewerking uit te voeren die resulteert in een eerdere datum, moet u een negatieve waarde doorgeven aan de add()methode:

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Console-uitvoer
Thu Dec 27 00:00:00 EET 2018

Het werkt!

Deze methode houdt rekening met de verschillende lengtes van maanden en schrikkeljaren. Al met al een prima methode. Het is precies wat de meeste programmeurs die met datums werken nodig hebben.

7. Rollende elementen van een datum

Maar soms zijn er situaties waarin we dit slimme gedrag niet willen, je wilt bijvoorbeeld iets aan een deel van de date doen zonder al het andere te veranderen.

De Calendarklas heeft roll()hiervoor de speciale methode. De handtekening is net als de add()methode, maar deze methode verandert slechts één element van de datum en laat de rest ongewijzigd.

Voorbeeld:

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Console-uitvoer
Fri Dec 27 00:00:00 EET 2019

We veranderden de maand, maar het jaar en de datum bleven ongewijzigd.