Kapitola 9
TIME – Bloky pro práci s časem

Datum a čas je v systému REXYGEN reprezentován časovou značkou, což je 64-bitové číslo. Momentálně jsou to nanosekundy od 1.ledna 2000 0:00:00.0 UTC, přičemž přestupné sekundy (leap second) se neuvažují. Doporučuje se o časové značce nic nepředpokládat, a pro práci s ní používat pouze bloky z této podskupiny, které vědí, jak ji správně interpretovat.

Většina bloků pro převod různých formátů datumu a času má parametr tz (timezone, tj. časové pásmo). Pokud je tento parametr prázdný nebo má hodnotu localtime, použije se časové pásmo nastavené v operačním systému a to včetně přepínání letního a zimního času (pokud to je v operačním systému nastaveno). Dále je možné nastavit pevné posunutí od UTC (formát hhmm, např. +0200 nebo -0800). Další časová pásma se nastavují podle toho, jak to vyžaduje operační systém (počítače, kde běží exekutiva).

Ve Windows je formát <třípísmenná zkratka><ofset v hodinách>[<třípísmenná zkratka letního času>], tj. například PST8PDT . Přičemž přepínání mezi zimním a letním časem je podle pravidel v USA (i když dokumentace je nejednoznačná - podle některých údajů mají Windows časová pásma podle IANA tabulek).

V linuxu je každé časové pásmo (včetně definice přepínání na letní a zimní čas i s respektováním jiných pravidel v různých letech) definováno souborem v adresáři /usr/share/zoneinfo nebo jeho podaresářích. Do parametru tz se pak píše dvojtečka a jméno tohoto souboru, tj. například :CET, :UTC, :Europe/Paris (dvojtečka na začátku není nutná, ale může se to pochopit jako zadání 2. způsobem a pak to zdánlivě nefunguje). Další možnost je zadat přímo definiční text (tj. obsah výše uvedeného souboru), např. NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0 (podrobný popis např. man timezone).

Známé problémy:

  • Blok DT2STR a STR2DT pro formát používá funkci strftime(), která neumí pracovat s milisekundami (ani nemůže, protože to není ve struktuře struct tm, kterou používá jako parametr). Pokud je to potřeba, je nutné nechat parametr format prázdný. Textová reprezentace se pak formátuje jinou funkcí ve formátu ISO8601, která s milisekundami pracovat umí.
  • Blok DT2STR a STR2DT nemá parametr locale. Pokud jsou ve stringu dny v týdnu nebo měsíce jako text, tak se použije aktuální locale z operačního systému (resp. locale nastavené v environment proměnných RexCore).
  • Blok STR2DT na Windows neumožňuje zadat formátovací string
  • Blok STR2DT na Windows neumožňuje zadat formátovací string (parameter format musí zůstat prázdný a načítá se datum a čas v ISO8601 formátu)
  • Pokud se u bloku STR2DT zadá formátovací string (parameter format) nelze načíst časové pásmo ze vstupního stringu
  • Pokud se do parametru tz zadá časové pásmo, které operační systém nezná, blok nehlásí žádnou chybu, ale použité časové pásmo je nedefinované (na Windows mi to dělalo UTC).
  • !!!!!!! mktime() i timelocal() na linuxu nerespektuje nastavení TZ v environment

2023 © REX Controls s.r.o., www.rexygen.com