Zielony Smok - logo witryny

Daty i czas: Klasa java.util.Calendar (3)

Klasa java.util.Calendar (3)

Ustawianie wartości pól.

Wartości mogą być ustawiane przy użyciu metod set(). Po wstawieniu wartości do pola metodą set() zmienia się wartość tego pola, ewentualnie niektóre inne pola, w których ta zmiana jest konieczna, a w tabeli fields[] ustawiana jest flaga oznaczająca, że wartość tego pola (pól) została zmieniona. Wartości wstawione do pól nie są przetwarzane aż do momentu kiedy potrzebne jest obliczenie ‘time’ i podanie czasu. Wywołanie metod: get(), getTimeInMillis(), getTime(), add() i roll() uruchamia wykonanie obliczeń i przeliczenie czasów i wartości pól.

Dokumentacja podaje przykład:

Jeżeli mamy datę 31 sierpnia 1999 i metodą set() ustawimy miesiąc na wrzesień, wewnętrznie będzie to data 31 września 1999. Gdybyśmy użyli metody get() pola zostałyby przeliczone i otrzymalibyśmy 1 października 1999. Jeżeli nie użyjemy metody get(), lecz użyjemy metody set() do ustawienia dnia miesiąca na 30, to wewnętrznie będzie to data 30 września 1999 r.

Tryby lenient i non-lenient

Klasa Calendar ma dwa tryby przeliczania wartości pól: ‘lenient’ i ‘non-lenient’.

W domyślnym trybie ‘lenient’ (pobłażliwy, wyrozumiały, tolerancyjny), akceptowane są wartości pól przekraczające zakres dopuszczalnych wartości (np. miesiąc 0, dzień 34). Po uruchomieniu metody get() wartości zostają przeliczone i gdy pobierzemy miesiąc i dzień otrzymamy miesiąc 1, dzień 3.

W trybie ‘non-lenient’, gdy wartości przekraczają dopuszczalny zakres, wyrzucany jest wyjątek.

isSet(int)
Metoda isSet(int)
Zwraca Metoda Opis
boolean isSet(int field) Sprawdza, czy dane pole jest ustawione.
isLenient()
Metoda isLenient()
Zwraca Metoda Opis
boolean isLenient() Sprawdza tryb obsługi wartości przekraczających dopuszczalny zakres
setLenient(boolean)
Metoda setLenient(boolean)
Zwraca Metoda Opis
void setLenient(boolean lenient) Ustawia tryb obsługi wartości przekraczających dopuszczalny zakres
package dt08.java_util_calendar;
import java.util.*;
public class Listing050 {
    public static void main(String[] args) {
        TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");
        Calendar cal = Calendar.getInstance(tz, Locale.getDefault());
        boolean yset = cal.isSet(Calendar.YEAR);
        System.out.println("yset: " + yset);
        boolean il = cal.isLenient();
        System.out.println("il: " + il);
        cal.setLenient(false);
        boolean il2 = cal.isLenient();
        System.out.println("il2: " + il2);
    }
}
yset: true
il: true
il2: false
set(int, int)
Metoda set(int, int)
Zwraca Metoda Opis
void set(int field, int value) Ustawiamy wartość podanego pola
set(int, int, int)
Metoda set(int, int, int)
Zwraca Metoda Opis
void set(int year, int month, int date) Ustawiamy rok, miesiąc, dzień
set(int, int, int, int)
Metoda set(int, int, int, int)
Zwraca Metoda Opis
void set(int year, int month, int date, int hourOfDay, int minute) Ustawiamy rok, miesiąc, dzień, godzinę, minutę
set(int, int, int, int, int, int)
Metoda set(int, int, int, int, int, int)
Zwraca Metoda Opis
void set(int year, int month, int date, int hourOfDay, int minute, int second) Ustawiamy rok, miesiąc, dzień, godzinę, minutę i sekundę
package dt08.java_util_calendar;
import java.util.*;
public class Listing051 {
    public static void main(String[] args) {
        TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");
        Calendar cal = Calendar.getInstance(tz, Locale.getDefault());
        cal.set(Calendar.YEAR, 1952);
        cal.set(1952, 5, 4, 21, 15);
        System.out.println("cal: " + cal);
    }
}
cal: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Warsaw",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=165,lastRule=java.util.SimpleTimeZone[id=Europe/Warsaw,offset=3600000,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=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=1952,MONTH=5,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_OF_MONTH=4,DAY_OF_YEAR=278,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=3,HOUR_OF_DAY=21,MINUTE=15,SECOND=17,MILLISECOND=483,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
setTime(Date)
Metoda setTime(Date)
Zwraca Metoda Opis
void setTime(Date date) Ustawia czas podany jako obiekt Date
package dt08.java_util_calendar;
import java.util.*;
public class Listing052 {
    public static void main(String[] args) {
        TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");
        Calendar cal = Calendar.getInstance(tz, Locale.getDefault());
        long l = System.currentTimeMillis();
        System.out.println("l: " + l);
        Date now = new Date(l);
        System.out.println("now: " + now);
        cal.setTime(now);
        System.out.println("cal: " + cal);
    }
}
now: Fri Oct 05 15:44:52 CEST 2018
cal: java.util.GregorianCalendar[time=1538747092051,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Warsaw",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=165,lastRule=java.util.SimpleTimeZone[id=Europe/Warsaw,offset=3600000,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=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_OF_MONTH=5,DAY_OF_YEAR=278,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=44,SECOND=52,MILLISECOND=51,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
setTimeInMillis(long)
Metoda setTimeInMillis(long)
Zwraca Metoda Opis
void setTimeInMillis(long millis) Ustawia kalendarz na datę podaną w milisekundach
setTimeZone(TimeZone)
Metoda setTimeZone(TimeZone)
Zwraca Metoda Opis
void setTimeZone(TimeZone value) Ustawia strefę czasową dla kalendarza
package dt08.java_util_calendar;
import java.util.*;
public class Listing053 {
    public static void main(String[] args) {
        TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");
        Calendar cal = Calendar.getInstance(Locale.getDefault());
        cal.setTimeZone(tz);
        long l = System.currentTimeMillis();
        cal.setTimeInMillis(l);
        System.out.println("cal: " + cal);
    }
}
cal: java.util.GregorianCalendar[time=1538747327437,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Warsaw",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=165,lastRule=java.util.SimpleTimeZone[id=Europe/Warsaw,offset=3600000,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=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_OF_MONTH=5,DAY_OF_YEAR=278,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=48,SECOND=47,MILLISECOND=437,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
setWeekdate(int, int, int)
Metoda setWeekdate(int, int, int)
Zwraca Metoda Opis
void setWeekDate(int weekYear, int weekOfYear, int dayOfWeek) Ustawia datę tygodniową. Więcej w rozdziel poświęconym normie ISO 8601
setFirstDayOfWeek(int)
Metoda setFirstDayOfWeek(int)
Zwraca Metoda Opis
void setFirstDayOfWeek(int value) Ustawia dzień, który będzie uznawany za pierwszy dzień tygodnia. W Polsce MONDAY
setMinimalDaysInFirstWeek(int)
Metoda setMinimalDaysInFirstWeek(int)
Zwraca Metoda Opis
void setMinimalDaysInFirstWeek(int value) Ustawia liczbę dni tygodnia, które muszą się znaleźć w danym roku, aby tydzień był uznany za należący do tego roku.
package dt08.java_util_calendar;
import java.util.*;
public class Listing054 {
    public static void main(String[] args) {
        TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");
        Calendar cal = Calendar.getInstance(tz, Locale.getDefault());
        cal.setWeekDate(1952, 23, 4);
        Date d = new Date(cal.getTimeInMillis());
        System.out.println("d: " + d);
        //-
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        cal.setMinimalDaysInFirstWeek(4);
        System.out.println("cal: " + cal);
    }
}
d: Wed Jun 04 15:55:03 CET 1952
cal: java.util.GregorianCalendar[time=-554634296694,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Warsaw",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=165,lastRule=java.util.SimpleTimeZone[id=Europe/Warsaw,offset=3600000,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=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=1952,MONTH=5,WEEK_OF_YEAR=23,WEEK_OF_MONTH=1,DAY_OF_MONTH=4,DAY_OF_YEAR=156,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=55,SECOND=3,MILLISECOND=306,ZONE_OFFSET=3600000,DST_OFFSET=0]

Manipulowanie wartościami pól

Jeżeli po dodaniu wartości do pola metodą add(int, int), nowa wartość przekracza dopuszczalną wartość dla tego pola, zmieniana jest wartość wyższego pola (rok jest wyższy niż miesiąc, etc). Jeżeli po zmianie pola wartość niższego pola jest niedopuszczalna, to jego wartość jest ustawiana na najbliższą dopuszczalną wartość.

Dokumentacja podaje przykład: Jeżeli do daty 31 sierpnia 1999 r. zostanie dodane 13 miesięcy to kalendarz zostanie ustawiony na 30 września 2000. Po dodaniu 13 miesięcy data powinna być 31 września 2000 r. Ponieważ liczba dni przekracza dopuszczalną wartość, dzień zostanie ustawiony na najbliższą możliwą wartość, czyli 30.

Metoda roll() nie zmienia wartości wyższych pól, ale dostosowuje niższe.

(add(int, int)
Metoda (add(int, int)
Zwraca Metoda Opis
void add(int field, int amount) abstract. Dodaje lub odejmuje podaną wartość do podanego pola korygując, jeśli zachodzi taka potrzeba, wartość wyższego pola
package dt08.java_util_calendar;
import java.util.*;
public class Listing055 {
    public static void main(String[] args) {
        TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");
        Calendar cal = Calendar.getInstance(tz, Locale.getDefault());
        cal.set(1999, Calendar.DECEMBER, 31);
        Date d = new Date(cal.getTimeInMillis());
        System.out.println("d: " + d);
        cal.add(Calendar.MONTH, 1);
        Date d1 = new Date(cal.getTimeInMillis());
        System.out.println("d1:  " + d1);
        cal.add(Calendar.MONTH, 1);
        Date d2 = new Date(cal.getTimeInMillis());
        System.out.println("d2: " + d2);
        cal.add(Calendar.MONTH, 1);
        Date d3 = new Date(cal.getTimeInMillis());
        System.out.println("d3: " + d3);
    }
}
d: Fri Dec 31 16:05:28 CET 1999
d1:  Mon Jan 31 16:05:28 CET 2000
d2: Tue Feb 29 16:05:28 CET 2000
d3: Wed Mar 29 16:05:28 CEST 2000
roll(int, boolean)
Metoda roll(int, boolean)
Zwraca Metoda Opis
void roll(int field, boolean up) abstract. Jeżeli true to dodaje 1 do podanego pola, jeżeli false to odejmuje 1 od podanego pola. 1 oznacza najmniejszą możliwą jednostkę.
roll(int, int)
Metoda roll(int, int)
Zwraca Metoda Opis
void roll(int field, int amount) Dodaje lub odejmuje podaną wartość od podanego pola bez korygowania wartości wyższych pól
package dt08.java_util_calendar;
import java.util.*;
public class Listing056 {
    public static void main(String[] args) {
        TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");
        Calendar cal = Calendar.getInstance(tz, Locale.getDefault());
        cal.set(1999, Calendar.DECEMBER, 31);
        Date d = new Date(cal.getTimeInMillis());
        System.out.println("d: " + d);
        cal.roll(Calendar.MONTH, 1);
        Date d1 = new Date(cal.getTimeInMillis());
        System.out.println("dl: " + d1);
        cal.roll(Calendar.MONTH, 1);
        Date d2 = new Date(cal.getTimeInMillis());
        System.out.println("d2: " + d2);
        cal.roll(Calendar.MONTH, true);
        Date d3 = new Date(cal.getTimeInMillis());
        System.out.println("d3: " + d3);
    }
}
d: Fri Dec 31 16:11:09 CET 1999
dl: Sun Jan 31 16:11:09 CET 1999
d2: Sun Feb 28 16:11:09 CET 1999
d3: Sun Mar 28 16:11:09 CEST 1999
clear()
Metoda clear()
Zwraca Metoda Opis
void clear() Ustawia wszystkie pola kalendarza oraz wartość time na wartości niezdefiniowane. Metoda isSet() zwraca false dla każdego pola.
clear(int)
Metoda clear(int)
Zwraca Metoda Opis
void clear(int field) Ustawia wartość wskazanego pola oraz wartość time na wartość niezdefiniowaną. Metoda isSet(int) dla tego pola zwróci false. Aby zresetować godzinę dnia należy użyć metody set(Calendar.HOUR_OF_DAY, 0).

Porównywanie

after(Object)
Metoda after(Object)
Zwraca Metoda Opis
boolean after(Object when) Sprawdza, czy obiekt when wskazuje wcześniejszą datę niż ten kalendarz. Porównuje milisekundy
before(Object)
Metoda before(Object)
Zwraca Metoda Opis
boolean before(Object when) Sprawdza czy obiekt when wskazuje późniejszą datę niż ten kalendarz. Porównuje milisekundy
compareTo(Calendar)
Metoda compareTo(Calendar)
Zwraca Metoda Opis
int compareTo(Calendar anotherCalendar) Porównuje dwa kalendarze (milisekundy). Zwraca 1 jeżeli ten kalendarz jest późniejszy, 0 jeżeli oba wskazują tę samą datę, -1 jeżeli ten obiekt jest wcześniejszy.
equals(Object)
Metoda equals(Object)
Zwraca Metoda Opis
boolean equals(Object obj) Porównuje dwa kalendarze (milisekundy)
package dt08.java_util_calendar;
import java.util.*;
public class Listing057{
	public static void main(String[] args) {
		TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");
		Calendar cal = Calendar.getInstance(tz, Locale.getDefault());
		//-
		TimeZone tz1 = TimeZone.getTimeZone("Europe/Warsaw");
		Calendar cal1 = Calendar.getInstance(tz1, Locale.getDefault());
		cal1.set(1952, Calendar.JUNE, 4);
		//
		boolean a = cal.after(cal1);
		System.out.println("a: "+a);
		//-
		boolean b = cal.before(cal1);
		System.out.println("b: "+b);
		//-
		boolean e = cal.equals(cal1);
		System.out.println("e: "+e);
		//-
		int ct = cal.compareTo(cal1);
		System.out.println("ct: "+ ct);
	}
}
a: true
b: false
e: false
ct: 1

Inne metody

clone()
Metoda clone()
Zwraca Metoda Opis
Object clone() Klonuje ten kalendarz
hashCode()
Metoda hashCode()
Zwraca Metoda Opis
int hashCode() Zwraca kod haszujący kalendarza
toInstant()
Metoda toInstant()
Zwraca Metoda Opis
Instant toInstant() Przekształca ten kalendarz w obiekt java.time.Instant. Będziemy tę klasę omawiali szczegółowo.
toString()
Metoda toString()
Zwraca Metoda Opis
String toString() Wyświetla ten kalendarz w postaci łańcucha znaków.
package dt08.java_util_calendar;
import java.time.*;
import java.util.*;
public class Listing058 {
    public static void main(String[] args) {
        TimeZone tz = TimeZone.getTimeZone("Europe/Warsaw");
        Calendar cal = Calendar.getInstance(tz, Locale.getDefault());
        System.out.println("cal: " + cal.toString());
        Instant ti = cal.toInstant();
        System.out.println("ti: " + ti);
    }
}
cal: java.util.GregorianCalendar[time=1538751354060,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Warsaw",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=165,lastRule=java.util.SimpleTimeZone[id=Europe/Warsaw,offset=3600000,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=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=40,WEEK_OF_MONTH=1,DAY_OF_MONTH=5,DAY_OF_YEAR=278,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=55,SECOND=54,MILLISECOND=60,ZONE_OFFSET=3600000,DST_OFFSET=3600000]
ti: 2018-10-05T14:55:54.060Z

Metody chronione

Nie są dostępne spoza pakietu. Są ważne dla zrozumienia sposobów obliczeń.

complete()
Metoda complete()
Zwraca Metoda Opis
void complete() protected. Ustawia nieustawione pola w kalendarzu
computeFields()
Metoda computeFields()
Zwraca Metoda Opis
void computeFields() protected. abstract. Przekształca milisekundy pola time w wartości pól kalendarzowych wymienionych w tablicy fields[]
computeTime()
Metoda computeTime()
Zwraca Metoda Opis
void computeTime() Przekształca wartości pól w tablicy fields[] na milisekundy pola time.