TimeZone в Ax2009
Запись от Владимир Максимов размещена 29.09.2014 в 16:01
Редкий случай, когда задачу на модификацию в Axapta поставили ДО вступления в силу очередного постановления правительства. Обычно задачу ставят спустя пол-года..год ПОСЛЕ . В данном случае, постановление о переводе часов на один час назад 26.10.2014 в 2 часа ночи. Ну, поскольку "ждать милостей от ..." не приходится, то решил разобраться самостоятельно
Импорт новых правил определения часовых поясов - это форма TimezonePatchImport. В ней выбирается файл XML, который формирует новую запись в таблице \System Documentation\Tables\TimeZonesRulesData.
Ага. И как должен выглядеть этот файл для новых правил? Ну, для начала надо понять назначение полей таблицы TimeZonesRulesData. Как оказалось, это не такая очевидная вещь Единственная ссылка, которую нашел
http://stackoverflow.com/questions/1...ersion/1293263
По этой ссылке (и после ряда экспериментов ) разобрался в назначении полей
----------------------------------------------------------
Назначение полей таблицы \System Documentation\Tables\TimeZonesRulesData
RULEID - идентификатор записи. Фассетный код: первые 2 символа - значение поля TZENUM, далее 3 символа - порядковый номер
TZENUM: Внешний ключ ссылки на таблицу TIMEZONESLIST или значение Base Enum: \System Documentation\Enums\Timezone
YEAR: 0 если правило действует бессрочно или год применения правила
BIAS: сдвиг времени в минутах относительно времени UTC
DBIAS: периодический сдвиг DST (добавляется к BIAS для установки общего сдвига от UTC)
Поля D* - определят начальную дату и время для сдвига DST
Поле S* - определят конечную дату и время для сдвига DST
Смысл полей ясен из их имени, кроме полей *DAY
DDAY и SDAY - это номер недели в месяце (1-4, 5 = последняя неделя)
DDAYOFWEEK и SDAYOFWEEK - номер дня недели (0 = Воскресенье)
Необходимо либо задавать диапазон (как начальные, так и конечные даты), либо не задавать диапазон вообще.
Указать только начальную или только конечную дату - невозможно. Это будет расценено как отсутствие диапазона. Т.е. действует на весь год
----------------------------------------------------------
Вот по какой логике в поле с названием DAY записывается номер недели в месяце? "Загадочная датская душа", не иначе Или уже американская
Кстати, и файл XML за 2010..2011 года тоже "чудо чудное". Начало диапазона тогда задали в октябре, а окончание в мае. Ну, вероятно, спиной к монитору программировали
----------------------------------------------------------
Ну, тогда новый файл XML получается таким
В принципе, можно сделать и одну запись, поставив в качестве даты окончания 2153 год. Но надо учитывать, что наше родное правительство в любой момент может выпустить очередное постановление о "самом правильном" распределении часовых поясов. О здоровье граждан они уже побеспокоились, следующее постановление замотивируют экономическим соображениями
Импорт новых правил определения часовых поясов - это форма TimezonePatchImport. В ней выбирается файл XML, который формирует новую запись в таблице \System Documentation\Tables\TimeZonesRulesData.
Ага. И как должен выглядеть этот файл для новых правил? Ну, для начала надо понять назначение полей таблицы TimeZonesRulesData. Как оказалось, это не такая очевидная вещь Единственная ссылка, которую нашел
http://stackoverflow.com/questions/1...ersion/1293263
По этой ссылке (и после ряда экспериментов ) разобрался в назначении полей
----------------------------------------------------------
Назначение полей таблицы \System Documentation\Tables\TimeZonesRulesData
RULEID - идентификатор записи. Фассетный код: первые 2 символа - значение поля TZENUM, далее 3 символа - порядковый номер
TZENUM: Внешний ключ ссылки на таблицу TIMEZONESLIST или значение Base Enum: \System Documentation\Enums\Timezone
YEAR: 0 если правило действует бессрочно или год применения правила
BIAS: сдвиг времени в минутах относительно времени UTC
DBIAS: периодический сдвиг DST (добавляется к BIAS для установки общего сдвига от UTC)
Поля D* - определят начальную дату и время для сдвига DST
Поле S* - определят конечную дату и время для сдвига DST
Смысл полей ясен из их имени, кроме полей *DAY
DDAY и SDAY - это номер недели в месяце (1-4, 5 = последняя неделя)
DDAYOFWEEK и SDAYOFWEEK - номер дня недели (0 = Воскресенье)
Необходимо либо задавать диапазон (как начальные, так и конечные даты), либо не задавать диапазон вообще.
Указать только начальную или только конечную дату - невозможно. Это будет расценено как отсутствие диапазона. Т.е. действует на весь год
----------------------------------------------------------
Вот по какой логике в поле с названием DAY записывается номер недели в месяце? "Загадочная датская душа", не иначе Или уже американская
Кстати, и файл XML за 2010..2011 года тоже "чудо чудное". Начало диапазона тогда задали в октябре, а окончание в мае. Ну, вероятно, спиной к монитору программировали
----------------------------------------------------------
Ну, тогда новый файл XML получается таким
PHP код:
<?xml version="1.0" encoding="UTF-8"?>
<Timezoneslist>
<!-- Russian Standard Time new rules -->
<Timezonedata>
<Timezonerule>
<ruleid>61004</ruleid>
<tzenum>61</tzenum>
<year>2014</year>
<bias>-240</bias>
<syear>0</syear>
<smonth>10</smonth>
<sdayofweek>0</sdayofweek>
<sday>5</sday>
<shour>2</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>60</sbias>
<dyear>0</dyear>
<dmonth>12</dmonth>
<ddayofweek>3</ddayofweek>
<dday>5</dday>
<dhour>23</dhour>
<dminute>59</dminute>
<dsecond>59</dsecond>
<dbias>0</dbias>
</Timezonerule>
<Timezonerule>
<ruleid>61005</ruleid>
<tzenum>61</tzenum>
<year>2015</year>
<bias>-180</bias>
<syear>0</syear>
<smonth>0</smonth>
<sdayofweek>0</sdayofweek>
<sday>0</sday>
<shour>0</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>0</sbias>
<dyear>0</dyear>
<dmonth>0</dmonth>
<ddayofweek>0</ddayofweek>
<dday>0</dday>
<dhour>0</dhour>
<dminute>0</dminute>
<dsecond>0</dsecond>
<dbias>0</dbias>
</Timezonerule>
</Timezonedata>
</Timezoneslist>
Всего комментариев 2
Комментарии
-
Применил описанный подход.
Получился такой файлик
Цитата:<?xml version="1.0" encoding="utf-8" ?>
<Timezoneslist>
<!-- Russian Standard Time new rules -->
<Timezonedata>
<Timezonerule>
<ruleid>61004</ruleid>
<tzenum>61</tzenum>
<year>2014</year>
<bias>-240</bias>
<syear>0</syear>
<smonth>10</smonth>
<sdayofweek>0</sdayofweek>
<sday>5</sday>
<shour>2</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>60</sbias>
<dyear>0</dyear>
<dmonth>12</dmonth>
<ddayofweek>3</ddayofweek>
<dday>5</dday>
<dhour>23</dhour>
<dminute>59</dminute>
<dsecond>59</dsecond>
<dbias>0</dbias>
</Timezonerule>
<Timezonerule>
<ruleid>61005</ruleid>
<tzenum>61</tzenum>
<year>2015</year>
<bias>-180</bias>
<syear>0</syear>
<smonth>0</smonth>
<sdayofweek>0</sdayofweek>
<sday>0</sday>
<shour>0</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>0</sbias>
<dyear>0</dyear>
<dmonth>0</dmonth>
<ddayofweek>0</ddayofweek>
<dday>0</dday>
<dhour>0</dhour>
<dminute>0</dminute>
<dsecond>0</dsecond>
<dbias>0</dbias>
</Timezonerule>
</Timezonedata>
<!-- Ekaterinburg Standard Time new rules -->
<Timezonedata>
<Timezonerule>
<ruleid>31004</ruleid>
<tzenum>31</tzenum>
<year>2014</year>
<bias>-360</bias>
<syear>0</syear>
<smonth>10</smonth>
<sdayofweek>0</sdayofweek>
<sday>5</sday>
<shour>2</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>60</sbias>
<dyear>0</dyear>
<dmonth>12</dmonth>
<ddayofweek>3</ddayofweek>
<dday>5</dday>
<dhour>23</dhour>
<dminute>59</dminute>
<dsecond>59</dsecond>
<dbias>0</dbias>
</Timezonerule>
<Timezonerule>
<ruleid>31005</ruleid>
<tzenum>31</tzenum>
<year>2015</year>
<bias>-300</bias>
<syear>0</syear>
<smonth>0</smonth>
<sdayofweek>0</sdayofweek>
<sday>0</sday>
<shour>0</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>0</sbias>
<dyear>0</dyear>
<dmonth>0</dmonth>
<ddayofweek>0</ddayofweek>
<dday>0</dday>
<dhour>0</dhour>
<dminute>0</dminute>
<dsecond>0</dsecond>
<dbias>0</dbias>
</Timezonerule>
</Timezonedata>
<!-- N. Central Asia Standard Time new rules -->
<Timezonedata>
<Timezonerule>
<ruleid>50004</ruleid>
<tzenum>50</tzenum>
<year>2014</year>
<bias>-420</bias>
<syear>0</syear>
<smonth>10</smonth>
<sdayofweek>0</sdayofweek>
<sday>5</sday>
<shour>2</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>60</sbias>
<dyear>0</dyear>
<dmonth>12</dmonth>
<ddayofweek>3</ddayofweek>
<dday>5</dday>
<dhour>23</dhour>
<dminute>59</dminute>
<dsecond>59</dsecond>
<dbias>0</dbias>
</Timezonerule>
<Timezonerule>
<ruleid>50005</ruleid>
<tzenum>50</tzenum>
<year>2015</year>
<bias>-360</bias>
<syear>0</syear>
<smonth>0</smonth>
<sdayofweek>0</sdayofweek>
<sday>0</sday>
<shour>0</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>0</sbias>
<dyear>0</dyear>
<dmonth>0</dmonth>
<ddayofweek>0</ddayofweek>
<dday>0</dday>
<dhour>0</dhour>
<dminute>0</dminute>
<dsecond>0</dsecond>
<dbias>0</dbias>
</Timezonerule>
</Timezonedata>
<!-- North Asia Standard Time new rules -->
<Timezonedata>
<Timezonerule>
<ruleid>56004</ruleid>
<tzenum>56</tzenum>
<year>2014</year>
<bias>-480</bias>
<syear>0</syear>
<smonth>10</smonth>
<sdayofweek>0</sdayofweek>
<sday>5</sday>
<shour>2</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>60</sbias>
<dyear>0</dyear>
<dmonth>12</dmonth>
<ddayofweek>3</ddayofweek>
<dday>5</dday>
<dhour>23</dhour>
<dminute>59</dminute>
<dsecond>59</dsecond>
<dbias>0</dbias>
</Timezonerule>
<Timezonerule>
<ruleid>56005</ruleid>
<tzenum>56</tzenum>
<year>2015</year>
<bias>-420</bias>
<syear>0</syear>
<smonth>0</smonth>
<sdayofweek>0</sdayofweek>
<sday>0</sday>
<shour>0</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>0</sbias>
<dyear>0</dyear>
<dmonth>0</dmonth>
<ddayofweek>0</ddayofweek>
<dday>0</dday>
<dhour>0</dhour>
<dminute>0</dminute>
<dsecond>0</dsecond>
<dbias>0</dbias>
</Timezonerule>
</Timezonedata>
<!-- North Asia East Standard Time new rules -->
<Timezonedata>
<Timezonerule>
<ruleid>55004</ruleid>
<tzenum>55</tzenum>
<year>2014</year>
<bias>-540</bias>
<syear>0</syear>
<smonth>10</smonth>
<sdayofweek>0</sdayofweek>
<sday>5</sday>
<shour>2</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>60</sbias>
<dyear>0</dyear>
<dmonth>12</dmonth>
<ddayofweek>3</ddayofweek>
<dday>5</dday>
<dhour>23</dhour>
<dminute>59</dminute>
<dsecond>59</dsecond>
<dbias>0</dbias>
</Timezonerule>
<Timezonerule>
<ruleid>55005</ruleid>
<tzenum>55</tzenum>
<year>2015</year>
<bias>-480</bias>
<syear>0</syear>
<smonth>0</smonth>
<sdayofweek>0</sdayofweek>
<sday>0</sday>
<shour>0</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>0</sbias>
<dyear>0</dyear>
<dmonth>0</dmonth>
<ddayofweek>0</ddayofweek>
<dday>0</dday>
<dhour>0</dhour>
<dminute>0</dminute>
<dsecond>0</dsecond>
<dbias>0</dbias>
</Timezonerule>
</Timezonedata>
<!-- Yakutsk Standard Time new rules -->
<Timezonedata>
<Timezonerule>
<ruleid>82004</ruleid>
<tzenum>82</tzenum>
<year>2014</year>
<bias>-600</bias>
<syear>0</syear>
<smonth>10</smonth>
<sdayofweek>0</sdayofweek>
<sday>5</sday>
<shour>2</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>60</sbias>
<dyear>0</dyear>
<dmonth>12</dmonth>
<ddayofweek>3</ddayofweek>
<dday>5</dday>
<dhour>23</dhour>
<dminute>59</dminute>
<dsecond>59</dsecond>
<dbias>0</dbias>
</Timezonerule>
<Timezonerule>
<ruleid>82005</ruleid>
<tzenum>82</tzenum>
<year>2015</year>
<bias>-540</bias>
<syear>0</syear>
<smonth>0</smonth>
<sdayofweek>0</sdayofweek>
<sday>0</sday>
<shour>0</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>0</sbias>
<dyear>0</dyear>
<dmonth>0</dmonth>
<ddayofweek>0</ddayofweek>
<dday>0</dday>
<dhour>0</dhour>
<dminute>0</dminute>
<dsecond>0</dsecond>
<dbias>0</dbias>
</Timezonerule>
</Timezonedata>
<!-- Vladivostok Standard Time new rules -->
<Timezonedata>
<Timezonerule>
<ruleid>76004</ruleid>
<tzenum>76</tzenum>
<year>2014</year>
<bias>-660</bias>
<syear>0</syear>
<smonth>10</smonth>
<sdayofweek>0</sdayofweek>
<sday>5</sday>
<shour>2</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>60</sbias>
<dyear>0</dyear>
<dmonth>12</dmonth>
<ddayofweek>3</ddayofweek>
<dday>5</dday>
<dhour>23</dhour>
<dminute>59</dminute>
<dsecond>59</dsecond>
<dbias>0</dbias>
</Timezonerule>
<Timezonerule>
<ruleid>76005</ruleid>
<tzenum>76</tzenum>
<year>2015</year>
<bias>-600</bias>
<syear>0</syear>
<smonth>0</smonth>
<sdayofweek>0</sdayofweek>
<sday>0</sday>
<shour>0</shour>
<sminute>0</sminute>
<ssecond>0</ssecond>
<sbias>0</sbias>
<dyear>0</dyear>
<dmonth>0</dmonth>
<ddayofweek>0</ddayofweek>
<dday>0</dday>
<dhour>0</dhour>
<dminute>0</dminute>
<dsecond>0</dsecond>
<dbias>0</dbias>
</Timezonerule>
</Timezonedata>
</Timezoneslist>Запись от Logger размещена 20.10.2014 в 21:56 -
Цитата:BIAS: сдвиг времени в минутах относительно времени UTC
DBIAS: периодический сдвиг DST (добавляется к BIAS для установки общего сдвига от UTC)Запись от MShi размещена 07.11.2014 в 11:42