
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]
