Přeskočit obsah

SP-Lang datum/čas¤

Typ datetime je hodnota, která představuje datum a čas v UTC, pomocí rozložené časové struktury.
Rozložený čas znamená, že rok, měsíc, den, hodina, minuta, sekunda a mikrosekunda jsou uloženy v dedikovaných polích; odlišně od například UNIX timestampu.

  • Časové pásmo: UTC
  • Rozlišení: mikrosekundy (šest desetinných míst)

Bitové rozložení¤

Datetime je uložen v 64bitovém unsigned integer (ui64); little-endian formát, Intel/AMD 64bit nativní.

Schema rozložení bitů data/času

Pozice Komponenta Bitů Maska Typ* Rozsah Poznámka
58-63 4 0…15 OK (0)/Chyba (8)/Rezervováno
46-57 rok 14 si16 -8190…8191
42-45 měsíc 4 0x0F ui8 1…12 Indexováno od 1
37-41 den 5 0x1F ui8 1…31 Indexováno od 1
32-36 hodina 5 0x1F ui8 0…24
26-31 minuta 6 0x3F ui8 0…59
20-25 sekunda 6 0x3F ui8 0…60 60 je pro přestupnou sekundu
0-19 mikrosekunda 20 ui32 0…1000000

Note

*) Typ je doporučený/minimální byte-aligned typ pro příslušnou komponentu.

Detaily časového pásma¤

Informace o časovém pásmu pochází z pytz respektive z IANA databáze časových pásem.

Note

Databáze časových pásem má přesnost až na minutu, což znamená, že sekundy a mikrosekundy zůstávají nedotčeny při převodu z/do UTC.

Data časového pásma jsou reprezentována strukturou adresářů v souborovém systému, která se obvykle nachází na /usr/share/splang nebo na místě určeném proměnnou prostředí SPLANG_SHARE_DIR.
Skutečná data časového pásma jsou uložena v podložce tzinfo.
Data časového pásma jsou generována skriptem generate_datetime_timezones.py během instalace SPLang.

Příklad složky tzinfo

```
.
└── tzinfo
  ├── Europe
    │  ├── Amsterdam.sptl
    │  ├── Amsterdam.sptb
    │  ├── Andorra.sptl
    │  ├── Andorra.sptb
```

.sptl a .sptb soubory obsahují rychlostně optimalizované binární tabulky, které podporují rychlé vyhledávání pro převody místního času <-> UTC.
.sptl je pro little-endian CPU architektury (x86 a x86-64), .sptb je pro big-endian architektury.

Soubor je memory-mapped do paměti procesu SP-Lang, zarovnaný na 64byte hranici, takže může být přímo použit jako vyhledávání.

Společné struktury¤

  • ym: Rok & měsíc, ym = (rok << 4) + měsíc
  • dhm: Den, hodina & minuta, dhm = (den << 11) + (hodina << 6) + minuta

Obě struktury jsou bitové části skalární hodnoty datetime a mohou být extrahovány z datetime pomocí AND a SHR.**

Hlavička souboru časového pásma¤

Délka hlavičky je 64 bytů.
Nespecifikované byty jsou nastaveny na 0 a rezervovány pro budoucí použití.

  • Pozice 00...03: SPt / magický identifikátor
  • Pozice 04: < pro little-endian CPU architekturu, > pro big-endian
  • Pozice 05: Verze (aktuálně 1 ASCII znak)
  • Pozice 08...09: Minimální rok/měsíc (min_ym) v tomto souboru, měsíc MUSÍ BÝT 1
  • Pozice 10...11: Maximální rok/měsíc (min_ym) v tomto souboru
  • Pozice 12...15: Pozice "parser tabulky" v souboru, vynásobené 64, typicky 1, protože parser tabulka je uložena přímo za hlavičkou

Parser tabulka časového pásma¤

Parser tabulka je vyhledávací tabulka používaná pro převod z místního data/času na UTC.

Organizace parser tabulky

Tabulka je organizována do řádků/roků a sloupců/měsíců.
Buňka má šířku 4 byty (32bitů), řádek má tedy délku 64 bytů.

Prvních 12 buněk jsou "primární parser buňky" (světle modrá barva), číslo odráží číslo měsíce (1...12).
Zbývající 4 buňky jsou "parser next buňky", číslo nX je index.

Primární parser buňka¤

Pozice buňky pro dané datum/čas se vypočítává jako pos = (ym - min_ym) << 5, což znamená, že rok a měsíc jsou použity pro lokalizaci buňky, minus minimální hodnotu roku a měsíce pro tabulku.

Struktura buňky:

  • 16 bitů: rozsah, 16bitů, dhm
  • 3 bitů: next
  • 7 bitů: hodinový offset od UTC
  • 6 bitů: minutový offset od UTC

dhm označuje den, hodinu a minutu v roce/měsíci, kdy je pozorována změna času (např. začátek/konec letního času).
Pro typický měsíc - kde není pozorována žádná změna času - hodnota dhm představuje maximum v daném měsíci.

Pokud je dhm pro vstupní datum/čas matematicky nižší než dhm z primární buňky, pak jsou informace o hodině a minutě použity k úpravě data/času z místního na UTC.

Pokud je dhm větší, pak next obsahuje číslo "parser next buňky"; přítomné na konci příslušného řádku parser tabulky.

Parser next buňka¤

"Parser next buňka" obsahuje "pokračování" informací pro měsíc, kde je pozorována změna času.
"Pokračování" znamená offset od UTC, který nastává, když místní čas překročí hranici změny času.

Struktura buňky:

  • 16 bitů: rozsah, 16bitů, dhm
  • 3 bitů: nepoužité, nastaveno na 0
  • 7 bitů: hodinový offset od UTC
  • 6 bitů: minutový offset od UTC

dhm označuje den, hodinu a minutu v roce/měsíci, kdy je pozorována DALŠÍ změna času (např. začátek/konec letního času).
Protože v současnosti podporujeme pouze jednu změnu času v měsíci, je toto pole nastaveno na maximální dhm pro daný měsíc.

Informace o hodině a minutě jsou použity k úpravě data/času z místního na UTC.

Note

V současnosti je podporována pouze jedna změna času za měsíc, což se zdá být plně dostačující pro všechny informace v databázi časových pásem IANA.

Prázdné/nepoužité next buňky jsou nulovány.

Chyby¤

Pokud je bit 63 datetime nastaven, pak hodnota data/času představuje chybu.
Pravděpodobně výraz, který tuto hodnotu vytvořil, selhal nějakým způsobem.

Chybový kód je uložen v dolních 32 bitech.

Smíšené typy¤

Protože datetime je 64bitový unsigned integer, může se stát - ačkoliv to NENÍ doporučeno - že bude použit jiný formát reprezentace data/času.
Toto je tabulka, jak automaticky detekovat, jaký formát je použit pro reprezentaci data/času.

Reprezentace 1. ledna 2000 1. ledna 2100 Dolní rozsah Horní rozsah
UNIX timestamp 946 681 200 4 102 441 200 0 10 000 000 000
UNIX timestamp (milli) 946 681 200 000 4 102 441 200 000 100 000 000 000 10 000 000 000 000
UNIX timestamp (micro) 946 681 200 000 000 4 102 441 200 000 000 100 000 000 000 000 10 000 000 000 000 000
SP-Lang datetime 140 742 023 840 793 010 147 778 898 258 559 000 100 000 000 000 000 000 -