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);
}
}
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);
}
}
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);
}
}