Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Где взять данные о времени начала и конца летнего времени (DST) для разных регионов?  [new]
Игаев
Member

Откуда: Киев
Сообщений: 204
Есть конфиг. таблица с данными о начале и конце летнего врмени (включении и выключении оного)

Вот пример данных (колонка = примеры значений) для двух городов LON (London), PAR (Paris) :
Город = LON, PAR
Стандартный сдвиг от UTC = 0, +1
Учитываеть летнее время= да, да
Сдвиг от UTC во время летнего времени = +1 , +2
Время начала = 01:00:00, 02:00:00
Время конца = 02:00:00, 03:00:00
День начала = последнее воскресенье марта, последнее воскресенье ноября
День окончания = последнее воскресенье октября, последнее воскресенье октября

Некторая логика (sql функции, sql процедуры, С++ модули) использует эту таблицу для определения точного сдвига локального времени относительно UTC.
Например, основываясь на дате+время начала и окончания летнего времени (DST) можно конвертировать одно локальное время в другое. Эти моменты включения и выключения летнего времени важны. Так как из представленного примера видно что в январе или июле разница между Парижем и Лондоном 1 час, а вот в нчале ноября Лондон уже вернулся на зимнее (UTC Offset +0) а Париж ещё нет (UTC Offset +2) и разница будет какое-то время в 2 часа.

Проблема - в таблице количество регинов кот наплакал.... А нужны многие города. Тобишь надо заполнить чем-то, чем-то правильным и обосновать что данные взяты из авторитетного источника.

Попытка решить проблему - поискал официальные документы о переводе времени. Ничего глобального. Каждый регион пляшет как хочет, соответственно для каждого региона своя нормативная база для перевода. Свои правила могут быть как у союза стран, так у отдельной страны, так и у отдельных шатов, городов.

Где же выдрать данные о хотя-бы нужных сейчас гордов (это порядка 20 городов)? Может в MS SQL сервере есть какая-то конфиг таблица? Есть в win реестре данные , но дней и времён вкл./выкл. летнего времени я не определил из представленных данных
(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Time Zones).


П.С.: модераторам - тему выбрал MS SQL так как задача решается на t-sql и конфиг. данные MS SQL сервера могут быть достаточными.
29 мар 13, 16:37    [14113861]     Ответить | Цитировать Сообщить модератору
 Re: Где взять данные о времени начала и конца летнего времени (DST) для разных регионов?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
tz database?

Что-то я не догоняю.
Вы хотите сами расчитывать время? Или юридически доказать начальству, что операционки сами всё рассчитывают на основании законов стран?

Если первое, то смысл? Пользуйтесь стандартными функциями и не ищите себе геморрой, ибо данные постоянно обновляются (дополняются).
Правильный расчёт времени довольно сложный, есть прорва нюансов.
Тема подымалась на форуме. Как я понял, SQL не предоставляет все необходимые функции расчёта, но всё можно получить через CLR.

Если второе, то сами ищите начиная от выше указанной ссылки.

И я так и не понял в чём у вас задача.
Для учёта временных зон, есть уже отработанные архитектуры. Поищите эти решения, и посмотрите почему они именно такие (если в этом загвоздка).
К примеру, одно из их свойств - избавление от расчётов в бизнес логике, ибо время приведено к нужному формату, а показ времени в локальном (для клиента) поясе так же делается автоматически или очень просто.
30 мар 13, 16:42    [14116414]     Ответить | Цитировать Сообщить модератору
 Re: Где взять данные о времени начала и конца летнего времени (DST) для разных регионов?  [new]
zozozozo
Guest
в космос. хранить в UTC 0:0 показывать в зоне клиента.
30 мар 13, 17:09    [14116455]     Ответить | Цитировать Сообщить модератору
 Re: Где взять данные о времени начала и конца летнего времени (DST) для разных регионов?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Игаев
но дней и времён вкл./выкл. летнего времени я не определил из представленных данных
(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\*).
Вы читаете формат TZI глазами?
30 мар 13, 17:13    [14116466]     Ответить | Цитировать Сообщить модератору
 Re: Где взять данные о времени начала и конца летнего времени (DST) для разных регионов?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
zozozozo
в космос. хранить в UTC 0:0 показывать в зоне клиента.
Не обязательно.
DateTimeOffset это тот же UTC, но только с плюшкой - временной зоной. Эдакое приближённое местоположение
30 мар 13, 17:33    [14116492]     Ответить | Цитировать Сообщить модератору
 Re: Где взять данные о времени начала и конца летнего времени (DST) для разных регионов?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
zozozozo,
А вообще никуда от TZ не деться на некоторых задачах.
Например, есть справочник временных периодов в локальном времени и зона (регион).
И нужно знать как его привести к UTC (задать текущую зону). Т.е. справочник статичен, а вот относительно UTC он же "плавает".
dt_utc = TimeZoneInfo.ConvertTimeToUtc(dt_tz, tzi);
TimeZoneInfo.ConvertTimeToUtc

Т.е. нужно как-то указывать местоположение и рассчитывать tzi (хотя бы тупо хранить идентификатор). Ибо в OS нет справочника регионов/городов, не говоря о соответствии r tzi - а это реально головная боль у всех.
30 мар 13, 18:00    [14116541]     Ответить | Цитировать Сообщить модератору
 Re: Где взять данные о времени начала и конца летнего времени (DST) для разных регионов?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Игаев,

Вам надо найти что-то типа http://citytimezones.info http://geonames.org где можно получить валидный tzi:
TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("<String ID from DB>");

Если городов нет в интернетовских базах (таких как geonames или citytimezones), вам придётся заводить и указывать вручную.
Но главное, помогать актуализировать информацию, этих баз. (призыв к социальности)
Фигово, что надо будет поддерживать актуальность - автоматически скачивать и обновлять изменения.
30 мар 13, 18:18    [14116574]     Ответить | Цитировать Сообщить модератору
 Re: Где взять данные о времени начала и конца летнего времени (DST) для разных регионов?  [new]
Игаев
Member

Откуда: Киев
Сообщений: 204
Mnior
tz database?
Что-то я не догоняю.
Вы хотите сами расчитывать время?

Не очень-то я хочу ) Мне необходимо самому расчитывать время, так другого варианта решения просто не нашлось.
Ниже изложу дополнения к задаче и свои решения. Рад буду если мои решения конструктивно раскритикуют и может найдётся лучше вариант.

Уточнения:
1. Есть таблица с некими записями (записей дохрена, таблица чуть-ли не основаная в системе и новые колонки мною добавляться не будут, даже не обсуждается), каждая запись имеет код региона (назовём это Location) и дату+время для данного региона (назовём это LocalTime).
2. Есть вьюха которая вытягивает данные из этой таблицы (+ join-ы к ещё нескольким таблицам)
3. Коды регионов - это собственные обзначения, использующиеся во многих логиках по базе, есть таблица с этими кодами и
расшифровкой названия регионов. Насколько коды регионов соответствуют чему-либо стандартизированному я не берусь сказать. Надо сверять. Наппример с вышеупомянутым www.geonames.org
4. Как я писал выше - есть таблица с указанием настроек перевода на летнее время для каждого региона

Так вот - во вьюхе надо добавить новое поле, которое отображает локальное время для одного конкретного региона (возьмём для примера Москву). То есть новое поле MoscowTime = конвертация LocalTime посредством Location

Пока окончательное решение (уже реализованное и тестирующееся):
Во вьюехе добавляется поле MoscowTime=функция конвертации даты(LocalTime,Location)
Функция сделана протестирована со всей кучей возможных казусов.

Проблема - в таблице конфигурации перехода на летнее время (пункт 4) - нет данных о необходимых регоинах. Необходимо её наполнить, но при этом из хоть как-то авторитетного источника (например, windows). Выискивать все региональные документы по переходу на летнее время и заполнять каждый регион вручную почти нереально по времени.


КАСАТЕЛЬНО СТАНДАРТНЫХ И КЛАСНЫХ СПОСОБОВ (укзанных тут и пробовавшиеся мною, но остановившиеся на весомых проблемах):

Mnior
tz database?
К примеру, одно из их свойств - избавление от расчётов в бизнес логике, ибо время приведено к нужному формату, а показ времени в локальном (для клиента) поясе так же делается автоматически или очень просто.

zozozozo
в космос. хранить в UTC 0:0 показывать в зоне клиента.

Нашёл функцию получающую системное время в UTC.
Но у меня нет клиента в его обычном виде, есть вьюха, в ней время+локация. На сервере где вызывается вьюха и получаются данные вообще может быть Лондонское системное время.
Каких-либо sql способов перевести время одной локации в другую я не нашёл.


Mnior
А вообще никуда от TZ не деться на некоторых задачах.
Например, есть справочник временных периодов в локальном времени и зона (регион).
И нужно знать как его привести к UTC (задать текущую зону). Т.е. справочник статичен, а вот относительно UTC он же "плавает".
dt_utc = TimeZoneInfo.ConvertTimeToUtc(dt_tz, tzi);
TimeZoneInfo.ConvertTimeToUtc

Т.е. нужно как-то указывать местоположение и рассчитывать tzi (хотя бы тупо хранить идентификатор). Ибо в OS нет справочника регионов/городов, не говоря о соответствии r tzi - а это реально головная боль у всех.


Мало мальски внятное решение НО - у меня в рапоряжении сиквел, а не C++ и C#. Пните меня если могу как-то использовать в sql функции TimeZoneInfo.ConvertTimeToUtc !!!Хотя при этом всё-равно остаются неясности с кодом региона. Но в крайнем случае можно сделать таблицу соответствия моих кодов к стандартным.

Единственное что мне приходит в голову при помощи сишного модуля вытащить из реестра нужные данные, но сейчас на это уже нет времени. Если дадут добро то я буду релизить ручное добавление регионов таблицу настроек. Данные я уже собрал для этого по разным источникам.
1 апр 13, 19:35    [14123479]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить