26.3.2024

D2000 v rôznych časových pásmach

Čas je jednou zo základných fyzikálnych veličín, pričom jednotkou času je sekunda. V D2000 však pracujeme s údajmi v reálnom čase, čím nám vznikajú menšie odvodené časové jednotky, ktoré sú ešte kratšie než sekunda - milisekundy, mikrosekundy či nanosekundy.

“Stretneme sa zajtra o tomto čase” nemusí byť ten istý čas

Hoci hodinky môžu ukazovať rovnaký čas, nemusí uplynúť rovnaké množstvo času. Táto zmena nastáva práve kvôli súčasnému posunu času z letného na zimný a zo zimného na letný. Dvakrát ročne tak dochádza buď k neplatným časom alebo k zdvojeniu časov medzi druhou a treťou hodinou rannou, pričom pri letnom čase sa deň o hodinu skráti, pri zimnom sa o hodinu predĺži.

31.3.2019 12:00:00“ – „30.3.2019 12:00:00“ = 23 hodín

Čas „skočí“ z 1:59 na 3:00

„27.10.2019 12:00:00“ – „26.10.2019 12:00:00“ = 25 hodín

Čas prvýkrát „skočí“ z 2:59 na 2:00

Až na druhý pokus z 2:59 na 3:00

Jednotlivé štáty môžu mať lokálne pravidlá pre čas, vláda môže pravidlá zmeny času kedykoľvek zmeniť a v Európskej únii by sa striedanie letného a zimného času malo od roku 2021 úplne zrušiť.

Ako plynie čas v D2000?

Pretože systém D2000 je okrem iného zameraný aj na efektivitu a výkon, tak pre internú reprezentáciu času nebol zvolený lokálny čas, ale UTC čas. Konkrétne variácia na Unixový timestamp, ktorý sa počíta v sekundách od 1.1.1972. UTC čas je monotónny, neskáče a výpočty s ním sú jednoduché a rýchle. Nasledovný príklad pripočítania 30 sekúnd je rovnako rýchly ako spočítanie dvoch čísel. 

Z tejto implementácie ale vyplýva dôležitý fakt a to, že premenná typu čas nemá žiadnu informáciu o pravidlách lokálneho času, teda o koľko je posunutý voči UTC, o rozklade na zložky času – dni, hodiny v rámci dňa, o tom, ktorý čas je neplatný ani o tom, kedy nastáva posun na letný a zimný čas. Je to obyčajné číslo.

Ako potom ale fungujú ESL funkcie, ktoré konvertujú čas na text alebo naopak a tie, ktoré rozkladajú čas na zložky, prípadne pripočítavajú deň, mesiac, rok a podobne? Pravidlá posunu času boli doteraz natvrdo definované tak, ako fungujú vo väčšine Európy od roku 1996. Navyše systém D2000 do verzie 8.0.6 časy zobrazoval vždy v stredoeurópskom čase (posun +1 hodina od UTC v zime a +2 hodiny v lete), bez ohľadu na to, či bol spustený v Londýne, Bratislave či Moskve. Od verzie 8.0.7 už základný posun voči UTC získaval z operačného systému, kde bol naštartovaný D2000 Kernel.

Systém D2000 sa však používa aj mimo Európskej únie, kde môžu byť pravidlá lokálneho času úplne iné ako v EÚ.. Pre projekt v Kazachstane bola vytvorená špeciálna verzia, ktorá sa riadi tamojšími pravidlami lokálneho času platnými od roku 2005. Časové značky s dátumami predtým môžu byť ale zobrazené nesprávne. Nakoľko tu išlo o novú aplikáciu bez histórie, tak to nepredstavovalo problém.

Z dlhodobého hľadiska samozrejme nie je riešením vytvárať špeciálne verzie, navyše keď pravidlá sú dynamické a vo svete sa často menia aj podľa politickej situácie. Podľa posledných informácii sa v celej EU plánuje zrušenie striedania letného a zimného času v roku 2021. To sa nás už týka kriticky, nakoľko existuje množstvo dlhodobo bežiacich aplikácií postavených na systéme D2000, kde po zmene pravidiel lokálneho času bude potrebné aj historické časy zobrazovať a interpretovať správne.

D2000 V12.2 prináša plnú podporu časových pásiem

Pod tým sa rozumie schopnosť bežať kdekoľvek na svete, správne interpretovať lokálne časy a konvertovať ich do internej reprezentácie alebo naopak. Aplikácia pravidiel striedania letného a zimného času podľa lokality so zohľadnením historických pravidiel pre danú lokalitu a zároveň pripravenosť na budúce zmeny lokálnych pravidiel. Procesy jednej aplikácie navyše môžu byť rozlezené po celom svete a bežať v rôznych časových pásmach. A to všetko s príjemným bonusom vo forme vyššieho výkonu pri práci s časom – len pre zaujímavosť syntetické testy ukázali, že kompozícia času zo zložiek je voči pôvodnej implementácii dvakrát rýchlejšia a dekompozícia na zložky je o tretinu rýchlejšia.

Ako sme dosiahli plnú podporu časových pásiem?

Použili sme databázu časových pásiem, verejne dostupnú na internete, ktorá je pravidelne aktualizovaná pod správou organizácie ICANN už od roku 1986. Táto organizácia má, okrem iného, na správu aj celosvetové prideľovanie IP adries.

Databáza je používaná v množstve počítačových systémov od operačných systémov ako Linux, Android, BSD a rôzne Unixové deriváty, cez databázové systémy ako PostgreSQL, MySQL, Oracle či Microsoft SQL Server. Priamo alebo nepriamo pomocou knižníc je používaná aj v množstve programovacích jazykov ako Java, PHP, Python či C++. Formát názvov časových pásiem bol zvolený ako „kontinent/mesto“. Mesto je buď hlavné mesto krajiny alebo najväčšie mesto danej oblasti. Zoznam časových pásiem tejto databázy je možné nájsť napríklad aj na wikipédii a momentálne obsahuje okolo 500 pásiem.

Aké sú možnosti behu aplikácie v rôznych časových pásmach?

Procesy D2000 môžu byť spustené v krajinách s rôznymi časovými pásmami. Serverovská časť napríklad beží na Slovensku, jeden užívateľ sa pripája cez HI v New Yorku, druhý v Žiline a tretí v Hong-Kongu. Niekedy je žiadané, aby proces používal časové pásmo systému, kde beží a niekedy zas, aby používal rovnaké časové pásmo ako D2000 server.

  1. Všetky procesy pracujú v časovom pásme D2000 servera
  2. Bez ohľadu na svoje umiestnenie
  3. Užívatelia vidia rovnaké časy
  4. Predvolené nastavenie aplikácie
  5. Procesy používajú časové pásmo podľa lokality
  6. Užívatelia vidia lokálne časy

Konfigurácia aplikácie a vynútenie časového pásma

Riadenie je možné parametrom aplikácie UseServerTimeZone. Predvolené nastavenie aplikácie je, že sa používa časové pásmo D2000 servera.

Nastavenie časového pásma je možné cez konfiguračný nástroj D2SMC alebo priamo v registroch aplikácie. Štartovacím parametrom /TZ je možné zas možné procesu HI vynútiť beh v inom časovom pásme, ako by bolo normálne. Užitočné to môže byť napríklad pri ladení, keď potrebujeme vidieť to isté ako zákazník, ktorý sa pripája z iného časového pásma.

Použitie v ESL

Rozšírené boli aj funkcie pre prácu s časom v ESL. Funkciám ako napríklad %StrToTimeEx, pribudol voliteľný parameter určujúci časové pásmo, ktoré má byť použité pri konverzii z alebo do lokálneho času. Parameter je textového typu a zadáva sa do neho názov časového pásma tak, ako je definovaný v databáze časových pásiem. Okrem názvu časového pásma je v ňom možné definovať aj fixný posun voči UTC. Užitočnou funkciou je funkcia %GetKnownTimeZones, ktorá naplní textový stĺpec štruktúry zoznamom všetkých známych časových pásiem z databázy časových pásiem a funkciou %IsValidTimeZone je možné overiť platnosť zadaného názvu časového pásma. Okrem funkcií na prácu s časom boli rozšírené aj ESL akcie na import a export CSV súborov. Dokumentácia všetkých ESL funkcií a akcií je dostupná online na stránkach doc.ipesoft.com.

Do budúcnosti plánujeme rozšíriť nastavenia grafických objektov a stavových textov o nastavenie časovej zóny, aby sme minimalizovali potrebu skriptovania.

Iné blogy