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)
Užitečné nástroje
Bitové rozložení¤
Datetime je uložen v 64bitovém unsigned integer (ui64); little-endian formát, Intel/AMD 64bit nativní.
| 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ícdhm: 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ě1ASCII 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, typicky1, 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.
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:
16bitů: rozsah, 16bitů,dhm3bitů:next7bitů: hodinový offset od UTC6bitů: 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:
16bitů: rozsah, 16bitů,dhm3bitů: nepoužité, nastaveno na 07bitů: hodinový offset od UTC6bitů: 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 | - |

