реклама на сайте
подробности

 
 
> Алгоритм перехода на летнее время.
SpiritDance
сообщение Mar 31 2008, 05:19
Сообщение #1


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Во-первых поздравляю всех с переходом на летнее время. Хорошего всем самочувствия.

Вопрос в следующем, кто-нибудь собственно алгоритм перехода на летнее время и обратно для часов встроенных систем? Если да то помогите либо подробным алгоритмом, либо исходниками пжалста. Надеюсь это не коммерческая тайна. smile.gif


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
acex2
сообщение Mar 31 2008, 07:21
Сообщение #2


Адепт
****

Группа: Свой
Сообщений: 520
Регистрация: 15-02-05
Пользователь №: 2 656



Цитата(SpiritDance @ Mar 31 2008, 09:19) *
Во-первых поздравляю всех с переходом на летнее время. Хорошего всем самочувствия.

Вопрос в следующем, кто-нибудь собственно алгоритм перехода на летнее время и обратно для часов встроенных систем? Если да то помогите либо подробным алгоритмом, либо исходниками пжалста. Надеюсь это не коммерческая тайна. smile.gif


Вот тут подробно, по странам: http://www.worldtimezone.com/daylight.html
Вкратце: "В России и в Европе переход на летнее время осуществляется в последнее воскресенье марта в 2:00 переводом часовых стрелок на 1 час вперед, а обратный переход осуществляется в последнее воскресенье октября в 3:00 переводом стрелок на 1 час назад."
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Mar 31 2008, 08:36
Сообщение #3


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Вот алгоритм вычисление собственно последнего дня недели в месяце в текущем году и интересует.

Журналирование данных ведется и временной поиск есть, думал избежать проблем с запретом перевода времени пока с последней журнальной записи не пройдет час. Еще подумаю.
на откуп пользователю отдать не могу, так как во-превых по времени определяется валидность sms? во вторых может возникнуть путаница с пониманием что в устройстве всегда записывается "зимнее" время.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
Andrew2000
сообщение Mar 31 2008, 10:35
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675



Цитата(SpiritDance @ Mar 31 2008, 12:36) *
Вот алгоритм вычисление собственно последнего дня недели в месяце в текущем году и интересует.

Для учета летнего/зимнего времени можно определить следующие переменные:

char saving-starts[3] = {p1,p2,p3};
char saving-ends[3] = {p1,p2,p3};
char time-offset = p4;
char saving-starts-time = p5;
char saving-ends-time = p6;

Параметры: p1 – какой день: 1 – первый, -1 – последний день недели месяца; p2 – день недели: 0 – воскресенье; p3 – месяц; p4 – разница во времени в минутах при переходе; p5, p6 – число минут после полуночи, когда переводить стрелки.

Переход на летнее время - Последнее воскресенье марта 2 часа ночи.
Переход на зимнее время - Последнее воскресенье октября 3 часа ночи.

saving-starts[3] = {1,0,4}; // последнее воскресенье марта
saving-ends[3] = {-1,0,10}; //последнее воскресенье октября
time-offset = 60; //1 час
saving-starts-time = 120; //2 часа ночи
saving-ends-time = 180; //3 часа ночи

Алгоритм перевода стрелок осенью:
1. На основании системных переменных знаем время перехода (tm_sec, tm_min, tm_hour);
2. Найдем (mktime) номер дня недели (tm_wday) для даты <сего года>.10.31 00:00:00 (последний день месяца);
3. dD := <номер дня недели <сего года>.10.31> – <номер дня недели перехода (из системной переменной)>; (учесть переход через 0);
4. ЧИСЛО ПЕРЕХОДА (tm_mday) = 31- dD;
5.Зная число (см. п.4) месяц (tm_mon) и год (tm_year) перехода (из системной переменной) и время перехода (см. п.1) определяем (time_t mktime(struct tm* )) точное время этого события в time_t формате.
Затем сверяем его с текущим временем.

Время перехода определяем при включении питания и при коррекции времени.

Примечание: в п.2,3,4 жестко записано 31, но нужно учитывать 30/31, если, вдруг, будет не октябрь и не март.

!!! аппаратные часы _всегда_ должны считать время в UTC, а учет летнего времени можно учитывать для отображения, журналов, и т.д.
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 31 2008, 11:25
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Andrew2000 @ Mar 31 2008, 16:35) *
!!! аппаратные часы _всегда_ должны считать время в UTC, а учет летнего времени можно учитывать для отображения, журналов, и т.д.
Угу. Я об этом же выше и толкую. Только в журнал тогда нужно писать лишь флаг-признак перехода на летнее время, а не собственно "летнее" время. Чтобы избежать глюков при индексировании и поиске почасовых записей.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 11:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016