Aria

Daty i czas: Klasa java.util.SimpleTimeZone

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

  1. SimpleTimeZone(int rawOffset, String ID) – strefa czasowa bez schematu zmian czasu na letni i z powrotem
  2. 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
  3. 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
  4. 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ą:

Zestawienie parametrów konstruktorów klasy java.util.SimpleTimeZone
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

Metody klasy java.util.SimpleTimeZone
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]