Программирование на Java
Шрифт:
ID - идентификатор временной зоны (см. пред.параграф);
startMonth - месяц перехода на летнее время;
startDay - день месяца перехода на летнее время*;
startDayOfWeek - день недели перехода на летнее время*;
startTime - время перехода на летнее время (указывается в миллисекундах);
endMonth - месяц окончания действия летнего времени;
endDay - день окончания действия летнего времени*;
endDayOfWeek - день недели окончания действия летнего времени*;
endTime - время
Перевод часов на зимний и летний вариант исчисления времени определяется специальным правительственным указом. Обычно переход на летнее время происходит в 2 часа в последнее воскресенье марта, а переход на зимнее время - в 3 часа в последнее воскресенье октября.
Алгоритм расчета таков:
* если startDay=1 и установлен день недели, то будет вычисляться первый день недели startDayOfWeek месяца startMonth (например, первое воскресенье);
* если startDay=-1 и установлен день недели, то будет вычисляться последний день недели startDayOfWeek месяца startMonth (например, последнее воскресенье);
* если день недели startDayOfWeek установлен в 0, то будет вычисляться число startDay конкретного месяца startMonth ;
* для того, чтобы установить день недели после конкретного числа, специфицируется отрицательное значение дня недели. Например, чтобы указать первый понедельник после 23 февраля, используется вот такой набор: startDayOfWeek=-MONDAY, startMonth=FEBRUARY, startDay=23
* для того, чтобы указать последний день недели перед каким-либо числом, указывается отрицательное значение этого числа и отрицательное значение дня недели. Например, для того, чтобы указать последнюю субботу перед 23 февраля, необходимо задать такой набор параметров: startDayOfWeek=-SATURDAY, startMonth=FEBRUARY, startDay=-23;
* все вышеперечисленное относится также и к окончанию действия летнего времени.
Рассмотрим пример получения текущей временной зоны с заданием перехода на зимнее и летнее время для России по умолчанию.
public class Test {
public Test {
}
public static void main(String[] args) {
Test test = new Test;
SimpleTimeZone stz = new SimpleTimeZone(
TimeZone.getDefault.getRawOffset
,TimeZone.getDefault.getID
,Calendar.MARCH ,-1
,Calendar.SUNDAY
,test.getTime(2,0,0,0)
,Calendar.OCTOBER ,-1
,Calendar.SUNDAY
,test.getTime(3,0,0,0) );
System.out.println(stz.toString);
}
int getTime(int hour,int min,int sec,int ms) {
return hour 3600000 + min 60000 + sec 1000 + ms;
}
}
Пример 14.11.
Результатом будет:
java.util.SimpleTimeZone[id=Europe/Moscow,offset=10800000,dstSavings=3600000,useDaylight=true, startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=7200000,startTimeMode=0, endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=10800000,endTimeMode=0]
Интерфейс Observer и класс Observable
Интерфейс Observer определяет всего один метод, update (Observable o, Object arg), который вызывается, когда обозреваемый объект изменяется.
Класс Observable предназначен для поддержки обозреваемого объекта в парадигме MVC (model-view-controller), которая, как и другие проектные решения и шаблоны, описана в специальной литературе. Этот класс должен быть унаследован, если возникает необходимость в том, чтобы отслеживать состояние какого-либо объекта. Обозреваемый объект может иметь несколько обозревателей. Соответственно, они должны реализовать интерфейс Observer.
После того, как в состоянии обозреваемого объекта что-то меняется, необходимо вызвать метод notifyObservers, который, в свою очередь, вызывает методы update у каждого обозревателя.
Порядок, в котором вызываются методы update обозревателей, заранее не определен. Реализация по умолчанию подразумевает их вызов в порядке регистрации. Регистрация осуществляется с помощью метода addObserver(Observer o). Удаление обозревателя из списка выполняется с помощью deleteObserver(Observer o). Перед вызовом notifyObservers необходимо вызвать метод setChanged, который устанавливает признак того, что обозреваемый объект был изменен.
Рассмотрим пример организации взаимодействия классов:
public class TestObservable extends java.util.Observable {
private String name = "";
public TestObservable(String name) {
this.name = name;
}
public void modify {
setChanged;
}
public String getName {
return name;
}
}
public class TestObserver implements java.util.Observer {
private String name = "";
public TestObserver(String name) {
this.name = name;
}
public void update(java.util.Observable o,Object arg) {
String str = "Called update of " + name;
str += " from " + ((TestObservable)o).getName;
str += " with argument " + (String)arg;
System.out.println(str);
}
}
public class Test {
public Test {
}
public static void main(String[] args) {
Test test = new Test;
TestObservable to = new TestObservable("Observable");
Окопники
Проза:
военная проза
рейтинг книги
Второгодка. Книга 4. Подавать холодным
4. Второгодка
Фантастика:
героическая фантастика
альтернативная история
сказочная фантастика
рейтинг книги
Бородинское поле
Проза:
военная проза
советская классическая проза
рейтинг книги
Воронцов. Перезагрузка
1. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
рейтинг книги
Страх
2. Дети Арбата
Проза:
историческая проза
рейтинг книги
Русский рок. Малая энциклопедия
Справочная литература:
энциклопедии
рейтинг книги
Неучтенный элемент. Том 5
5. Антимаг. Вне системы
Фантастика:
фэнтези
рейтинг книги
Мистика
Детективы:
классические детективы
исторические детективы
рейтинг книги
Том 6. Проза, письма
6. Собрание сочинений в шести томах
Проза:
русская классическая проза
рейтинг книги
Том 18. Пьесы, сценарии, инсценировки 1921-1935
18. Собрание сочинений в тридцати томах
Проза:
русская классическая проза
рейтинг книги
Я уже князь. Книга XIX
19. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
рейтинг книги
Домашняя медицинская энциклопедия. Симптомы и лечение самых распространенных заболеваний
Научно-образовательная:
медицина
рейтинг книги
Калейдоскоп.В Игре брода нет(Водовороты Игры)
2. Калейдоскоп. Все грани Игры
Фантастика:
фэнтези
рейтинг книги