Klasa java.util.SimpleTimeZone
Klasa SimpleTimeZone
jest klasą dziedziczącą po TimeZone
. Reprezentuje strefy czasowe przeznaczone do użycia z klasą GregorianCalendar
. Klasa zawiera opis przesunięcia względem GMT, nazywanego rawOffset
(przesunięcie surowe – czyli liczone w stosunku do czasu standardowego). Zawiera również schemat zasad wprowadzania czasu letniego (start rule) oraz powrotu do czasu zimowego (end rule). Klasa zawiera informacje tylko dla jednego zbioru zasad start rule i jednego end rule, czyli uwzględnia jedynie ostatnie znane reguły. Można jednak ustawić setStartYear, który określa rok wprowadzenia tego jednego schematu. W Polsce np. zasada wprowadzania czasu letniego w ostatnią niedzielę marca o godzinie 02:00 (+01:00) i powrotu do czasu zimowego w ostatnią niedzielę października o godz 03:00 (-01:00) obowiązuje od roku 1996.
Konstruktory
- SimpleTimeZone(int rawOffset, String ID) – strefa czasowa bez schematu zmian czasu na letni i z powrotem
- SimpleTimeZone(int rawOffset, String ID, int startMonth, int startDay, int startDayOfWeek, int startTime, int endMonth, int endDay, int endDayOfWeek, int endTime) – przesunięcie domyślnie o 3600000 milisekund, domyślny czas ścienny
- SimpleTimeZone(int rawOffset, String ID, int startMonth, int startDay, int startDayOfWeek, int startTime, int endMonth, int endDay, int endDayOfWeek, int endTime, int dstSavings) – domyślny czas ścienny
- SimpleTimeZone(int rawOffset, String ID, int startMonth, int startDay, int startDayOfWeek, int startTime, int startTimeMode, int endMonth, int endDay, int endDayOfWeek, int endTime, int, endTimeMode, int dstSavings)
Parametry konstruktorów oznaczają:
Typ | Nazwa | Opis |
---|---|---|
int | rawOffset | Przesunięcie czasu standardowego strefy czasowej względem GMT w milisekundach |
String | ID | Identyfikator strefy czasowej |
int | startMonth | Miesiąc wprowadzenia czasu letniego (miesiące liczone są od 0 do 11) |
int | startDay | Numer dnia miesiąca wprowadzenia czasu letniego – liczone od 0. Zobacz opis pod tabelą. |
int | startDayOfWeek | Numer dnia tygodnia wprowadzenia czasu letniego. Zobacz opis pod tabelą. |
int | startTime | Godzina na ściennym zegarze, o której dokonywana jest zmiana czasu na letni – w milisekundach od początku dnia (jest to aktualny czas standardowy, a więc zimowy) |
int | endMonth | Miesiąc powrotu do czasu zimowego |
int | endDay | Dzień miesiąca powrotu do czasu zimowego. Zobacz opis pod tabelą |
int | endDayOfWeek | Numer dnia tygodnia powrotu do czasu zimowego. Zobacz opis pod tabelą |
int | endTime | Godzina na zegarze ściennym, o której zostanie prowadzona zmiana – w milisekundach od początku dnia |
int | dstSavings | Odcinek czasu w milisekundach, o który przesuwany jest czas |
int | startTimeMode | Tryb podawania czasu startTime |
int | endTimeMode | Tryb podawania czasu endTime |
Wyjaśnienia do tabeli:
- Jeżeli czas letni zaczyna się 1 marca: startMonth=2, startDay=1, startDayOfWeek=0.
- Jeżeli czas letni zaczyna się w drugą niedzielę kwietnia: startMonth=3, startDay=8,startDayOfWeek=(-)7.
- Jeżeli czas letni zaczyna się w ostatnią środę przed 21 marca (albo w środę 21 marca): startMonth=2,
startDayOfMonth=(-)21, startDayOfWeek=(-)3 - Jeśli czas zimowy zaczyna się w ostatnią niedzielę października: startMonth=9, startDayOfWeek=7,
startDayOfMonth(-)1
Przyklady
package dt07.java_util_simpletimezone; import java.util.*; public class Listing029 { public static void main(String[] args) { SimpleTimeZone stz = new SimpleTimeZone(-28800000, "America/Los_Angeles", Calendar.APRIL, 1, -Calendar.SUNDAY, 7200000, Calendar.OCTOBER, -1, Calendar.SUNDAY, 7200000, 3600000); System.out.println("stz: " + stz); } }
Objaśnienia parametrów:
Użycie konstruktora 3 – przykład z dokumentacji klasy
- rowOffset =(-)8.00h = 8 x 3600000 = – 28800000
- ID = „America/Los_Angeles”
- DST zaczyna się w pierwszą niedzielę kwietnia o 2:00 w nocy:
- startMonth = 3 = Calendar.APRIL
- startDay = 1
- startDayOfWeek=-1 = -Calendar.SUNDAY
- startTime= 2×3600000 = 7200000
- DST kończy się w ostatnią niedzielę października o godz. 2:00 w nocy:
- endMonth = 9 = Calendar.OCTOBER
- startDay = -1
- startDayofWeek= 1 = Calendar.SUNDAY
- startTime=2 x 3600000 = 7200000
- dstSavings=3600000
stz: java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=3,startDay=1,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]
package dt07.java_util_simpletimezone; import java.util.*; public class Listing030 { public static void main(String[] args) { SimpleTimeZone stz = new SimpleTimeZone(3600000, "Europe/Paris", Calendar.MARCH, -1, Calendar.SUNDAY, 3600000, SimpleTimeZone.UTC_TIME, Calendar.OCTOBER, -1, Calendar.SUNDAY, 3600000, SimpleTimeZone.UTC_TIME, 3600000); System.out.println("stz: " + stz); } }
Objaśnienia parametrów:
Użycie konstruktora 4 – przykład z dokumentacji klasy.
- rowOffset =1.00h = 1 x 3600000 = 3600000
- ID = „Europe/Paris”
- DST zaczyna się w ostatnią sobotę marca o godz. 1:00 UTC:
- startMonth = 2 = Calendar.MARCH
- startDay = -1
- startDayOfWeek=1 = Calendar.SUNDAY
- startTime= 1×3600000 = 3600000
- startTimeMode= 2 = SimpleTimeZone.UTC_TIME
- DST kończy się w ostatnią niedzielę października o godz. 1:00 UTC:
- endMonth = 9 = Calendar.OCTOBER
- startDay = -1
- startDayofWeek= 1 = Calendar.SUNDAY
- endTimeMode = 2 = SimpleTimezone.UTC_TIME
- startTime=1 x 3600000=3600000
- dstSavings=3600000
stz: java.util.SimpleTimeZone[id=Europe/Paris,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]
package dt07.java_util_simpletimezone; import java.util.*; public class Listing031 { public static void main(String[] args) { SimpleTimeZone stz = new SimpleTimeZone(3600000, "Europe/Warsaw", Calendar.MARCH, -1, Calendar.SUNDAY, 7200000, SimpleTimeZone.WALL_TIME, Calendar.OCTOBER, -1, Calendar.SUNDAY, 10800000, SimpleTimeZone.WALL_TIME, 3600000); stz.setStartYear(1996); System.out.println("stz: " + stz); } }
Objaśnienie parametrów:
Strefa dla Warszawy:
- rowOffset =1.00h = 1 x 3600000 = 3600000
- ID = „Europe/Warsaw”
- DST zaczyna się w ostatnią niedzielę marca o godz. 2:00 zegarowej:
- startMonth = 2 = Calendar.MARCH
- startDay = -1
- startDayOfWeek=1 = Calendar.SUNDAY
- startTime= 2 x 3600000 = 3600000
- startTimeMode = 0 = SimpleTimeZone.WALL_TIME
- DST kończy się w ostatnią niedzielę października o godz. 3:00 zegarowej:
- endMonth = 9 = Calendar.OCTOBER
- startDay = -1
- startDayofWeek= 1 = Calendar.SUNDAY
- endTimeMode = 0 = SimpleTimezone.WALL_TIME
- startTime=3 x 3600000=10800000
- dstSavings=3600000
stz: java.util.SimpleTimeZone[id=Europe/Warsaw,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=1996,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=10800000,endTimeMode=0]
Właściwości
Godzinę możemy podać używając trybu:
- WALL_TIME – czas wskazywany przez zegar ścienny
- STANDARD_TIME – czas standardowy (zimowy)
- UTC_TIME – czas UTC
Metody
Zwraca | Metoda | Opis | Listing |
---|---|---|---|
Object | clone() | Zwraca klon tego strefy czasowej | – |
boolean | equals(Object obj) | Zwraca ‘true’ jeśli ‘obj’ równa się temu obiektowi strefy czasowej | – |
int | hashCode() | Zwraca kod mieszający dla tego obiektu strefy czasowej | – |
String | toString() | Zwraca łańcuch znaków da tego obiektu strefy czasowej | niemal każdy |
int | getDSTSavings() | Zwraca odstęp czasowy, który trzeba dodać do lokalnego czasu standartowego, aby otrzymać czas lokalnego zegara ściennego. Jeśli metoda useDaylightTime() zwraca true, te metoda zwraca 1h=3600000 ms. Jeśli tamta metoda zwraca false, ta metoda zwraca 0. |
032 |
void | setDSTSavings (int millisSavedDuringDST) | Pozwala na ustawienie odstępu czasowego, który trzeba dodać do lokalnego czasu standardowego, aby otrzymać czas lokalnego zegara ściennego. |
– |
int | getOffset(int era, int year, int month, int day, int dayOfWeek, int millis) | Określa przesunięcie strefy czasowej dla podanej daty w milisekundach, zmodyfikowaną w przypadku czasu letniego, czyli ile trzeba dodać do UTC, aby otrzymać czas lokalny. Miesiące liczone są od 0. |
033 |
int | getOffset(long date) | Określa przesunięcie tej strefy czasowej w milisekundach względem UTC dla podanej daty | 033 |
int | getRawOffset() | Zwraca czas w milisekundach, który należy dodać do UTC, aby otrzymać standardowy czas tej strefy czasowej |
034 |
void | setRawOffset(int millis) | Ustawia podstawowy czas przesunięcia dla tej strefy czasowej w stosunku do GMT | 034 |
int | setStartYear(int year) | Rok od którego obowiązują podane reguły czasu | 035 |
boolean | hasSameRules(TimeZone other) | Zwraca ‘true’, jeśli ta i porównywana strefa mają te same zasady i przesunięcie albo ‘false’ w przeciwnym wypadku. Jeśli różnią się jedynie ID-em zwracane jest ‘true’ Jeśli ‘other’ jest ‘null’ zwracane jest false. |
035 |
boolean | inDaylightTime(Date date) | Sprawdza czy podana data wypada w tej strefie czasowej w czasie letnim czy nie. | 035 |
boolean | observesDaylightTime() | Zwraca ‘true’ jeśli strefa jest aktualnie czas letni albo gdy przejście od czas standardowego do letniego jest przewidywane w czasie przyszłym. Domyślna implementacja zwraca ‘true’ jeśli metoda useDaylightTime() zwraca ‘true’ lub inDaylightTime(new Date) zwraca ‘true’ |
035 |
boolean | useDaylightTime() | Sprawdza czy ta strefa czasowa używa DST. Zwraca ‘true’ jeśli tak, ‘false’ jeśli nie. | 032 |
void | setStartRule(int startMonth, int startDay, int startTime) | Ustawienie reguł wprowadzenia czasu letniego | 036 |
void | setStartRule(int startMonth, int startDay, int startDayOfWeek, int startTime) | Ustawienie reguł wprowadzenia czasu letniego | 037 |
void | setStartRule(int startMonth, int startDay, int startDayOfWeek, int startTime, boolean after) | Ustawienie reguł wprowadzenia czasu letniego | 038 |
void | setEndRule(int endMonth, int endDay, int endTime) | Ustawienie reguł wprowadzenia czasu zimowego | 036 |
void | setEndRule(int endMonth, int endDay, int endDayOfWeek, int endTime) | Ustawienie reguł wprowadzenia czasu zimowego | 037 |
void | setEndRule(int endMonth, int endtDay, int endDayOfWeek, int endTime, boolean after) | Ustawienie reguł wprowadzenia czasu zimowego | 038 |
Przykłady
package dt07.java_util_simpletimezone; import java.util.*; public class Listing032 { public static void main(String[] args) { SimpleTimeZone stz = new SimpleTimeZone(3600000, "Europe/Warsaw", Calendar.MARCH, -1, Calendar.SUNDAY, 7200000, SimpleTimeZone.WALL_TIME, Calendar.OCTOBER, -1, Calendar.SUNDAY, 10800000, SimpleTimeZone.WALL_TIME, 3600000); stz.setStartYear(1996); //System.out.println(stz); boolean dt = stz.useDaylightTime(); System.out.println("dt: " + dt); int dst = stz.getDSTSavings(); System.out.println("dst: " + dst); } }
dt: true dst: 3600000
package dt07.java_util_simpletimezone; import java.util.*; public class Listing033 { public static void main(String[] args) { SimpleTimeZone stz = new SimpleTimeZone(3600000, "Europe/Warsaw", Calendar.MARCH, -1, Calendar.SUNDAY, 7200000, SimpleTimeZone.WALL_TIME, Calendar.OCTOBER, -1, Calendar.SUNDAY, 10800000, SimpleTimeZone.WALL_TIME, 3600000); stz.setStartYear(1996); int off1 = stz.getOffset(GregorianCalendar.AD, 1952, 5, 4, Calendar.WEDNESDAY, 0); System.out.println("off1: " + off1); TimeZone tz1 = TimeZone.getDefault(); GregorianCalendar cal = new GregorianCalendar(); long millis = cal.getTimeInMillis(); int off2 = tz1.getOffset(millis); System.out.println("off2: " + off2); } }
off1: 3600000 off2: 7200000
package dt07.java_util_simpletimezone; import java.util.*; public class Listing034 { public static void main(String[] args) { SimpleTimeZone stz = new SimpleTimeZone(3600000, "Europe/Warsaw", Calendar.MARCH, -1, Calendar.SUNDAY, 7200000, SimpleTimeZone.WALL_TIME, Calendar.OCTOBER, -1, Calendar.SUNDAY, 10800000, SimpleTimeZone.WALL_TIME, 3600000); stz.setStartYear(1996); // int off = stz.getRawOffset(); System.out.println("off: " + off); stz.setRawOffset(7200000); int off1 = stz.getRawOffset(); System.out.println("off1: " + off1); } }
off: 3600000 off1: 7200000
package dt07.java_util_simpletimezone; import java.util.*; public class Listing035 { public static void main(String[] args) { SimpleTimeZone stz = new SimpleTimeZone(3600000, "Europe/Warsaw", Calendar.MARCH, -1, Calendar.SUNDAY, 7200000, SimpleTimeZone.WALL_TIME, Calendar.OCTOBER, -1, Calendar.SUNDAY, 10800000, SimpleTimeZone.WALL_TIME, 3600000); stz.setStartYear(1996); // TimeZone tz1 = TimeZone.getTimeZone("Europe/Oslo"); boolean rules = stz.hasSameRules(tz1); System.out.println("rules: " + rules); //- boolean obs = stz.observesDaylightTime(); System.out.println("obs: " + obs); //- GregorianCalendar gd = new GregorianCalendar(); long millis = gd.getTimeInMillis(); Date date = new Date(millis); boolean op = stz.inDaylightTime(date); System.out.println("op: " + op); //- } }
rules: false obs: true op: true
package dt07.java_util_simpletimezone; import java.util.*; public class Listing036 { public static void main(String[] args) { SimpleTimeZone stz = new SimpleTimeZone(3600000, "Europe/Pruszkow"); //start 3 kwietnia godz 2:00 zegara ściennego stz.setStartRule(Calendar.APRIL, 3, 7200000); //end 21 października, godz. 3:00 zegara ściennego stz.setEndRule(Calendar.APRIL, 21, 10800000); System.out.println("stz: " + stz); } }
stz: java.util.SimpleTimeZone[id=Europe/Pruszkow,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=1,startMonth=3,startDay=3,startDayOfWeek=0,startTime=7200000,startTimeMode=0,endMode=1,endMonth=3,endDay=21,endDayOfWeek=0,endTime=10800000,endTimeMode=0]
package dt07.java_util_simpletimezone; import java.util.*; public class Listing037 { public static void main(String[] args) { SimpleTimeZone stz = new SimpleTimeZone(3600000, "Europe/Pruszkow"); //start 3 kwietnia godz 2:00 zegara ściennego stz.setStartRule(Calendar.APRIL, 3, 0, 7200000); //end 21 października, godz. 3:00 zegara ściennego stz.setEndRule(Calendar.APRIL, 21, 0, 10800000); System.out.println("stz: " + stz); //- SimpleTimeZone stz1 = new SimpleTimeZone(3600000, "Europe/Pruszkow"); //start I niedziela kwietnia godz. 2:00 zegara ściennego stz1.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 7200000); //end ostatnia niedziela października, godz. 3:00 zegara ściennego stz1.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 10800000); } }
stz: java.util.SimpleTimeZone[id=Europe/Pruszkow,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=1,startMonth=3,startDay=3,startDayOfWeek=0,startTime=7200000,startTimeMode=0,endMode=1,endMonth=3,endDay=21,endDayOfWeek=0,endTime=10800000,endTimeMode=0]
package dt07.java_util_simpletimezone; import java.util.*; public class Listing038 { public static void main(String[] args) { SimpleTimeZone stz = new SimpleTimeZone(3600000, "Europe/Pruszkow"); //start w pierwszą niedzielę po 15 kwietnia o 2:00 zegara ściennego; //również gdy niedziela przypada 15 kwietnia stz.setStartRule(Calendar.APRIL, 15, Calendar.SUNDAY, 7200000, true); //end pierwsza niedziela po 15 października godz. 3:00 zegara ściennego //również gdy niedziela przypada 15 października stz.setEndRule(Calendar.OCTOBER, 15, Calendar.SUNDAY, 10800000, true); System.out.println("stz: " + stz); // SimpleTimeZone stz1 = new SimpleTimeZone(3600000, "Europe/Pruszkow"); //start w ostatnią niedzielę przed 15 kwietnia o 2:00 zegara ściennego; //również gdy niedziela przypada 15 kwietnia stz1.setStartRule(Calendar.APRIL, 15, Calendar.SUNDAY, 7200000, false); //end pierwsza niedziela przed 15 października godz. 3:00 zegara ściennego //również gdy niedziela przypada 15 października stz1.setEndRule(Calendar.OCTOBER, 15, Calendar.SUNDAY, 10800000, false); System.out.println("stz1: " + stz1); } }
stz: java.util.SimpleTimeZone[id=Europe/Pruszkow,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=3,startDay=15,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=9,endDay=15,endDayOfWeek=1,endTime=10800000,endTimeMode=0] stz1: java.util.SimpleTimeZone[id=Europe/Pruszkow,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=4,startMonth=3,startDay=15,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=4,endMonth=9,endDay=15,endDayOfWeek=1,endTime=10800000,endTimeMode=0]