Выбрать главу

Рассмотрим пример, в котором на консоль последовательно выводятся:

* временная зона по умолчанию;

* список всех возможных временных зон;

* список временных зон, которые совпадают с текущей временной зоной.

public class Test {

public Test() {

}

public static void main(String[] args) {

Test test = new Test();

TimeZone tz = TimeZone.getDefault();

int rawOffset = tz.getRawOffset();

System.out.println("Current TimeZone" + tz.getDisplayName() + tz.getID() + "\n\n");

// Display all available TimeZones

System.out.println("All Available TimeZones \n");

String[] idArr = tz.getAvailableIDs();

for(int cnt=0;cnt < idArr.length;cnt++) {

tz = TimeZone.getTimeZone(idArr[cnt]);

System.out.println(test.padr(tz.getDisplayName() +

tz.getID(),64) + " raw offset=" + tz.getRawOffset() +

";hour offset=(" + tz.getRawOffset()/ (1000 60 60 ) + ")");

}

// Display all available TimeZones same as for Moscow

System.out.println("\n\n TimeZones same as for Moscow \n");

idArr = tz.getAvailableIDs(rawOffset);

for(int cnt=0;cnt < idArr.length;cnt++) {

tz = TimeZone.getTimeZone(idArr[cnt]);

System.out.println(test.padr(tz.getDisplayName()+

tz.getID(),64) + " raw offset=" + tz.getRawOffset() +

";hour offset=(" + tz.getRawOffset()/ (1000 60 60 ) + ")");

}

}

String padr(String str,int len) {

if(len - str.length() > 0) {

char[] buf = new char[len - str.length()];

Arrays.fill(buf,' ');

return str + new String(buf);

} else {

return str.substring(0,len);

}

}

}

Пример 14.9.

Результатом будет:

Current TimeZone Moscow Standard TimeEurope/Moscow

TimeZones same as for Moscow

Eastern African TimeAfrica/Addis_Aba raw offset=10800000;hour offset=(3)

Eastern African TimeAfrica/Asmera raw offset=10800000;hour offset=(3)

Eastern African TimeAfrica/Dar_es_Sa raw offset=10800000;hour offset=(3)

Eastern African TimeAfrica/Djibouti raw offset=10800000;hour offset=(3)

Eastern African TimeAfrica/Kampala raw offset=10800000;hour offset=(3)

Eastern African TimeAfrica/Khartoum raw offset=10800000;hour offset=(3)

Eastern African TimeAfrica/Mogadishu raw offset=10800000;hour offset=(3)

Eastern African TimeAfrica/Nairobi raw offset=10800000;hour offset=(3)

Arabia Standard TimeAsia/Aden raw offset=10800000;hour offset=(3)

Arabia Standard TimeAsia/Baghdad raw offset=10800000;hour offset=(3)

Arabia Standard TimeAsia/Bahrain raw offset=10800000;hour offset=(3)

Arabia Standard TimeAsia/Kuwait raw offset=10800000;hour offset=(3)

Arabia Standard TimeAsia/Qatar raw offset=10800000;hour offset=(3)

Arabia Standard TimeAsia/Riyadh raw offset=10800000;hour offset=(3)

Eastern African TimeEAT raw offset=10800000;hour offset=(3)

Moscow Standard TimeEurope/Moscow raw offset=10800000;hour offset=(3)

Eastern African TimeIndian/Antananar raw offset=10800000;hour offset=(3)

Eastern African TimeIndian/Comoro raw offset=10800000;hour offset=(3)

Eastern African TimeIndian/Mayotte raw offset=10800000;hour offset=(3)

Пример 14.10.

Класс SimpleTimeZone

Класс SimpleTimeZone, как потомок TimeZone, реализует его абстрактные методы и предназначен для применения в настройках, использующих Григорианский календарь. В большинстве случаев нет необходимости создавать экземпляр данного класса с помощью конструктора. Вместо этого лучше использовать статические методы, которые возвращают тип TimeZone, рассмотренные в предыдущем параграфе. Единственная, пожалуй, причина для использования конструктора - необходимость задания нестандартных правил перехода на зимнее и летнее время.

В классе SimpleTimeZone определено три конструктора. Рассмотрим наиболее полный с точки зрения функциональности вариант, который, помимо временной зоны, задает летнее и зимнее время.

public SimpleTimeZone(int rawOffset,

String ID,

int startMonth,

int startDay,

int startDayOfWeek,

int startTime,

int endMonth,

int endDay,

int endDayOfWeek,

int endTime)

rawOffset - временное смещение относительно гринвича;

ID - идентификатор временной зоны (см. пред.параграф);

startMonth - месяц перехода на летнее время;

startDay - день месяца перехода на летнее время*;

startDayOfWeek - день недели перехода на летнее время*;

startTime - время перехода на летнее время (указывается в миллисекундах);

endMonth - месяц окончания действия летнего времени;

endDay - день окончания действия летнего времени*;

endDayOfWeek - день недели окончания действия летнего времени*;

endTime - время окончания действия летнего времени (указывается в миллисекундах).

Перевод часов на зимний и летний вариант исчисления времени определяется специальным правительственным указом. Обычно переход на летнее время происходит в 2 часа в последнее воскресенье марта, а переход на зимнее время - в 3 часа в последнее воскресенье октября.

Алгоритм расчета таков:

* если startDay=1 и установлен день недели, то будет вычисляться первый день недели startDayOfWeek месяца startMonth (например, первое воскресенье);

* если startDay=-1 и установлен день недели, то будет вычисляться последний день недели startDayOfWeek месяца startMonth (например, последнее воскресенье);