1. Växla från Dateklassen till Calendarklassen

Programmerare älskade Dateklassen för dess enkelhet och stöd för Unix-standarder, men som ni vet har varje ros sina törnen.

Programmerare ville ha en "smart" Dateklass. Och de fick som de ville i form av Calendarklassen. Det var tänkt som ett sätt att inte bara lagra datum, utan också att utföra svåra operationer med datum.

Klassens fullständiga namn Calendarär java.util.Calendar. Glöm inte att lägga till den i en importsats om du bestämmer dig för att använda den i din kod.

Du kan skapa ett Calendarobjekt med detta kommando:

Calendar date = Calendar.getInstance();

Klassens statiska getInstance()metod Calendarskapar ett Calendarobjekt initierat med det aktuella datumet. Kalendern du vill skapa kommer att skapas baserat på inställningarna på datorn som kör programmet.

Eller rättare sagt, kalendern du får... Det beror på att människor på jorden inte är begränsade till en enda kalender. Istället använder de många. Och nästan alla är förknippade med någon religion eller ett land. Klassen Calendarstödjer 3 av dem:

Kalender Beskrivning
Gregorianska kalendern Kristen gregoriansk kalender
Buddhistisk kalender Buddhistisk kalender
JapaneseImperialCalendar Japanska kejserliga kalendern

Men det finns också kinesiska och arabiska kalendrar. I grund och botten är det inte så lätt att arbeta med tid som det verkar.

I den kinesiska kalendern är året officiellt 4716 vid tidpunkten för skrivningen av denna lektion. Och enligt den muslimska kalendern är året 1398. Välkommen till den stora världen, min programmerare vän.

2. Skapa ett kalenderobjekt

Vi kommer att använda den gregorianska kalendern, eftersom den är den vanligaste i världen. Åtminstone tills Kina köper Oracle och gör den kinesiska kalendern till den viktigaste.

Du kan skapa ett kalenderobjekt med vilket datum som helst med ett uttalande så här:

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

Ja, man måste skriva GregorianCalendarvarje gång. Istället för Calendarkan du också skriva GregorianCalendar- det kommer också att fungera. Men att skriva Calendarär bara kortare.

Årtalet måste skrivas i sin helhet, t.ex. kan du inte skriva 19 istället för 2019. Månader är fortfarande numrerade från noll. Men som tidigare är månadens dagar inte numrerade från noll. Nördar!

För att ställa in tid och datum måste du skicka in tiden som ytterligare argument:

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

Du kan till och med passera på millisekunder om det behövs. De är parametern efter antalet sekunder.

3. Visar ett kalenderobjekt på skärmen

Om du bara skriver ut ett kalenderobjekt på skärmen blir du inte särskilt nöjd med resultatet.

Koda
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Konsolutgång
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=?]

Saken att tänka på här är att en kalender är en kalender, inte ett datum : den har alla typer av inställningar som alla kommer att visas på skärmen.

Det skulle vara lämpligt att använda ett SimpleDateFormatobjekt för att visa en kalender, men tills vi studerar det kan du använda detta life hack.

Date date = calendar.getTime();

Ett Calendarobjekt kan enkelt konverteras till ett Dateobjekt, och du vet redan hur man visar ett Dateobjekt. Du kan använda kod så här för att konvertera ett Calendarobjekt till en Date:

Genom att använda getTime()metoden:

Koda Konsolutgång
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Det är en helt annan sak, eller hur?

4. Arbeta med delar av ett datum

För att få ett specifikt element av ett datum (t.ex. år, månad, ...) Calendarhar klassen get()metoden. Det är en enda metod, men den har parametrar:

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

Var calendarär en Calendarvariabel och MONTHär ett konstant fält i Calendarklassen.

Du skickar ett av Calendarklassens konstantfält som argument till getmetoden, och du får det önskade värdet som resultat.

Exempel

Koda Beskrivning
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);


era (före eller efter den vanliga eran)
år
månad
dag i månaden

veckodag
timmar
minuter
sekunder

För att ändra ett element i ett datum, använd setmetoden:

calendar.set(Calendar.MONTH, value);

Var calendarär en Calendarvariabel och MONTHär ett konstant fält i Calendarklassen.

När du arbetar med setmetod skickar du ett av Calendarklassens konstantfält som första argument och det nya värdet som andra argument.

Exempel

Koda Beskrivning
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());


år = 2019
månad = juli (numrerad från 0)
4:e dagen
timmar
minuter
sekunder

Calendar5. Klassens konstanter

Klassens konstanta fält Calendarär inte begränsade till de för att namnge element i ett datum. Det verkar finnas fält för alla tillfällen.

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

Till exempel finns det konstanta fält att referera till månader:

Och även veckodagarna:

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

Vi kommer inte att lista allt. Vi vill bara inte att du ska bli förvånad om du ser konstanter som denna i koden.

Att använda konstanter gör koden mer läsbar, vilket är anledningen till att programmerarna använder dem. Och månader är numrerade från noll också för att förbättra läsbarheten. Eller inte.

6. Ändra datum i ett Calendarobjekt

Klassen Calendarhar en metod som låter dig arbeta på en dejt på mer intelligenta sätt. Du kan till exempel lägga till ett år, en månad eller flera dagar till ett datum. Eller ta bort dem. Denna metod kallas add(). Att arbeta med det ser ut så här:

calendar.add(Calendar.MONTH, value);

Var calendarär en Calendarvariabel och MONTHär ett konstant fält i Calendarklassen.

När du arbetar med addmetod skickar du ett av Calendarklassens konstantfält som det första argumentet och som det andra argumentet – det nya värdet som ska läggas till.

Detta är en annan intelligent metod. Låt oss se hur smart det är:

Koda
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Konsolutgång
Fri Mar 01 00:00:00 EET 2019

Den här metoden förstår att det bara finns 28 dagar i februari 2019, så det resulterande datumet är 1 mars.

Nu tar vi bort 2 månader! Vad ska vi få? 27 december 2018! Låt oss kolla nu.

För att utföra en operation som resulterar i ett tidigare datum måste du skicka ett negativt värde till metoden add():

Koda
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Konsolutgång
Thu Dec 27 00:00:00 EET 2018

Det fungerar!

Denna metod tar hänsyn till olika längder på månader såväl som skottår. Allt som allt en jättebra metod. Det är precis vad de flesta programmerare som jobbar med datum behöver.

7. Rullande delar av ett datum

Men ibland finns det situationer då vi inte vill ha det här smarta beteendet, t.ex. att du vill göra något med en del av dejten utan att ändra allt annat.

Klassen Calendarhar den speciella roll()metoden för detta. Dess signatur är precis som add()metoden, men den här metoden ändrar bara en del av datumet och lämnar resten oförändrad.

Exempel:

Koda
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Konsolutgång
Fri Dec 27 00:00:00 EET 2019

Vi ändrade månaden, men år och datum förblev oförändrade.