1. Przejście z klasy Datedo klasyCalendar

Przejście z klasy Date do klasy Callendar

Programiści pokochali tę klasę Dateza jej prostotę i obsługę standardów Unix, ale jak wiesz, nasze słabości są przedłużeniem naszych mocnych stron.

Programiści chcieli mieć „inteligentną klasę Date”. I taka klasa się pojawiła: stała się klasą Calendar. Został pomyślany jako narzędzie nie tylko do przechowywania, ale także do kompleksowej pracy z datami.

W pełni kwalifikowana nazwa klasy Calendarto java.util.Calendar. Nie zapomnij dodać go do importu, jeśli zdecydujesz się użyć go w swoim kodzie.

Możesz utworzyć obiekt Calendarza pomocą polecenia:

Calendar date = Calendar.getInstance();

Metoda getInstance()klasy statycznej Calendarutworzy obiekt Calendarzainicjowany bieżącą datą. W zależności od ustawień komputera, na którym uruchomiony jest program, zostanie utworzony żądany kalendarz.

Bardziej poprawne byłoby stwierdzenie - obecny. Faktem jest, że na Ziemi nie ma jednego, ale wiele kalendarzy. I prawie każdy z nich jest związany z jakąś religią lub krajem. Klasa Calendarobsługuje 3 z nich:

Kalendarz Opis
Kalendarz gregoriański Chrześcijański kalendarz gregoriański
kalendarz buddyjski Kalendarz buddyjski
Japoński kalendarz cesarski Japoński kalendarz cesarski

Ale są też kalendarze chińskie i arabskie. Ogólnie rzecz biorąc, praca z czasem nie jest tak łatwa, jak się wydaje.

W Chinach w momencie pisania tego wykładu oficjalnie jest rok 4716. A według kalendarza muzułmańskiego - 1398. Witaj w wielkim świecie, przyjacielu programiście.

2. Utwórz obiekt kalendarza

Będziemy używać kalendarza gregoriańskiego jako najpopularniejszego na świecie. Przynajmniej dopóki Chiny nie kupią Oracle i nie uczynią swojego kalendarza głównym.

Obiekt kalendarza z dowolną datą jest tworzony za pomocą polecenia:

Calendar date = new GregorianCalendar(год, месяц, день);

Tak, za każdym razem musisz pisać GregorianCalendar. Zamiast tego możesz także Calendarnapisać GregorianCalendar: to również zadziała. Ale Calendarmów krótko.

Rok należy wpisać w całości: nr 19 zamiast 2019. Miesiące nadal są liczone od zera. A dni miesiąca są nadal liczone nie od zera (słabowianki!).

Aby ustawić nie tylko datę, ale także godzinę, musisz przekazać je jako dodatkowe parametry:

... = new GregorianCalendar(год, месяц, день, часы, minutyы, секунды);

W razie potrzeby możesz nawet podać milisekundy: są one określane jako następny parametr po sekundach.

3. Wyświetlenie obiektu kalendarza na ekranie

Jeśli po prostu wyświetlisz obiekt kalendarza na ekranie, nie będziesz zadowolony z wyniku.

Kod
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Wyjście na wyświetlaczu
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=?]

Chodzi o to, że kalendarz to tylko kalendarz, a nie data : ma wiele różnych ustawień i wszystkie są wyświetlane na ekranie.

Prawidłowe będzie wyświetlanie obiektu kalendarza za pomocą klasy SimpleDateFormat, ale dopóki go nie przestudiujemy, możesz użyć life hacka.

Date date = calendar.getTime();

Faktem jest, że obiekt typu Calendarmożna łatwo przekonwertować na obiekt typu i już wiesz, Datejak wyświetlić obiekt typu . DateCoś takiego może przekonwertować obiekt Calendarna Date:

Użycie metody getTime():

Kod Wyjście na wyświetlaczu
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Całkiem inna sprawa, prawda?

4. Praca z fragmentami dat

Aby uzyskać fragment daty (rok, miesiąc, ...), klasa Calendarma specjalną metodę - get(). Jedna metoda, ale z parametrami:

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

Gdzie calendar jest zmienną typu Calendari MONTH jest zmienną stałą klasy Calendar.

get Przekazujesz specjalną stałą klasy jako parametr do metody Calendar, w wyniku czego otrzymujesz pożądaną wartość.

Przykłady

Kod Opis
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 (pne lub później)
rok
miesiąc
dzień miesiąca

dzień tygodnia
godziny
minuty
sekundy

Poniższa metoda służy do zmiany fragmentu daty set:

calendar.set(Calendar.MONTH, oznaczający);

Gdzie calendar jest zmienną typu Calendari MONTH jest zmienną stałą klasy Calendar.

set Przekazujesz specjalną stałą klasy jako pierwszy parametr do metody Calendari nową wartość jako drugi parametr.

Przykłady

Kod Opis
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());


rok = 2019
miesiąc = lipiec (numerowane od 0)
4 godziny
minuty sekundy

5. Stałe klasoweCalendar

Klasa Calendarma stałe nie tylko dla nazw fragmentów dat, ale wydaje się, że na każdą okazję.

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

Na przykład istnieją stałe oznaczające miesiące:

Lub na przykład dla dni tygodnia:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("Это пятница");
}

Nie wymienimy wszystkiego. Chcemy tylko, abyś nie był zaskoczony, jeśli zobaczysz takie wpisy w kodzie.

Używanie stałych sprawia, że ​​kod jest bardziej czytelny, dlatego programiści je dodali. Cóż, miesiące są również ponumerowane od zera, ze względu na czytelność. Albo nie.

6. Zmień datę w obiekcieCalendar

Klasa Calendarma metodę, która pozwala na wykonywanie inteligentniejszych operacji na dacie. Na przykład dodaj rok, miesiąc lub kilka dni do daty. Albo zabrać. Ta metoda nazywa się add(). Wygląda na to, że praca z nim wygląda tak:

calendar.add(Calendar.MONTH, oznaczający);

Gdzie calendar jest zmienną typu Calendari MONTH jest zmienną stałą klasy Calendar.

add Przekazujesz stałą klasy specjalnej jako pierwszy parametr do metody Calendar, a wartość, która ma zostać dodana jako drugi parametr.

Osobliwością tej metody jest to, że jest inteligentna. Zobaczmy, jak:

Kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Wyjście na wyświetlaczu
Fri Mar 01 00:00:00 EET 2019

Ta metoda zakłada, że ​​luty 2019 ma tylko 28 dni, a ostateczną datą jest 1 marca.

Teraz weźmy 2 miesiące! Co powinno się stać? 27 grudnia 2018! Teraz sprawdźmy.

Aby wykonać akcję skracającą datę, należy add()przekazać do metody wartość ze znakiem ujemnym:

Kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Wyjście na wyświetlaczu
Thu Dec 27 00:00:00 EET 2018

Pracuje!

Ta metoda uwzględnia długości miesięcy i lata przestępne. W sumie świetna metoda. Dokładnie to, czego potrzebuje większość programistów, którzy ściśle współpracują z datami.

7. Przewijanie fragmentów daty

Ale czasami zdarzają się sytuacje, w których takie sprytne zachowanie jest niepotrzebne: chcesz zrobić coś z jedną częścią daty, nie zmieniając wszystkiego innego.

W tym celu klasa Calendarma specjalną metodę - roll(). Swoją sygnaturą jest całkowicie podobny do metody add(), ale wszelkie zmiany za jej pomocą wpływają na jeden parametr, reszta pozostaje niezmieniona.

Przykład:

Kod
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Wyjście na wyświetlaczu
Fri Dec 27 00:00:00 EET 2019

Zmieniliśmy miesiąc, ale rok i data pozostały niezmienione.