Programovanie makier v LibreOffice: Bližší pohľad na dátum a čas – funkcie CDateToISO a CDateFromISO

LibreOffice V tomto dielu nášho seriálu o programovaní makier v LibreOffice pokračujeme v popisu funkcií pre prácu s dátumom a časom. Dnes sa pozrieme na normu ISO 8601 a predstavíme si dve funkcie, ktoré pracujú s týmto medzinárodne uznávaným štandardom.  

ISO 8601

 ISO 8601 je medzinárodný štandard, ktorý predpisuje formát dátumu a času. Tento predpis bol vydaný Medzinárodnou organizáciou pre normalizáciu. Odtiaľ aj skratka ISO.

Prečo práve spomíname túto normu? Pretože uľahčuje prechod medzi viacerými jazykovými a lokálnymi nastaveniami dátumu a času. Tento štandard zvyšuje prenositeľnosť medzi rôznymi konfiguráciami počítačov a to je už niečo, čo sa vám môže zísť.

Hlavná pointa je, že dátum začína od významnejších čísel po tie menej významné. Takže miesto 01.02.2016 je prevod do ISO 8601 normy nasledovný: 20160201. Čiže platný formát je YYYYMMDD, kde Y je year, M moon a D day. Existujú k zápisu oddeľovače napr. YYYY-MM-DD, ale je na vás, či ich využijete, pretože sú dobrovoľné.

Funkcia CDateToISO

Chcete pohodlne previesť dátum na formu ISO 8601? Nie je žiadny problém, pri programovaní makier v LibreOffice vieme využiť funkciu CDateToISO.

Funkcia CDateToISO má nasledovnú syntax:

CDateToISO( číslo )

Program, ktorý si ukážeme, už dôverne poznáte z minulých dielov, ale je perfektný na ukazovanie fungovania niektorých funkcii.

01. príklad: Bližší pohľad na funkciu CDateToISO

Sub functionIsDateToISO REM začiatok makra
On Error Resume Next REM ak nastane chyba, nech makro beží ďalej
Dim i As Integer  REM deklarácie premenných
Dim retazec As String
Dim pole()
REM naplňujeme naše pole
pole() = Array(Now,10.5,-1000,"1000","-1000","10.12.1989","10:21","11/12","10:20:55","11/5/1000","21/11/1987","11\11\1111","5 November, 1983 11:12:24","1983.12.12","12.12.1922 15:10:22","15:10:22 12.12.1922")
REM v cykle experimentujeme s funkciou IsDate
For i = LBound(pole()) To UBound(pole())
        retazec = retazec & CStr(i+1) & ". " & pole(i) & " -> "
        retazec = retazec & CDateToISO(pole(i))
        retazec = retazec & Chr(10)
Next 
REM výpis na obrazovku 
MsgBox retazec
End Sub   REM koniec procedúry

Testujeme funkciu CDateToISO Testujeme funkciu CDateToISO

Rozbor makra:
Pozrieme sa na jednotlivé prípady funkčností danej funkcie.
1. 28.02.2018 22:10:23 -> 20180228 – vidíte ako súčasný dátum zmeníte na ISO 8601 formu.
2. 10,5 -> 19000109 – rozpamätajte sa, ako zadávame číslo ako dátum a čas vo funkcii CDate
3. -1000 -> 18970404 – záporne číslo? Žiadny problém s konverziou na ISO 8601
9. 10:20:55 -> 18991230 – ak nenapíšeme dátum, len čas, tak nám to vypľuje dátum, ako keby sme funkcii CDate napísali hodnotu 0.
11. 21/11/1987 -> – nevyhovujúci formát dátumu, zavisí to od lokálneho nastavenia
16. 15:10:22 12.12.1922 -> nevyhovuje formátu času a dátumu, najprv ide dátum a až tak čas

Funkcia CDateFromISO

Ak sme raz previedli dátum do ISO 8601 podoby, môžeme i späť? Áno môžeme a funkcia, ktorá sa presne o to stará sa nazýva CDateFromISO. Fungovanie tejto funkcie si samozrejme ukážeme v druhom príklade, ale najprv si predstavme jednoduchú základnú syntax funkcie.

CDateFromISO( reťazec )

Argumentom funkcie CDateFromISO je dátum vo formáte ISO 8601 napísaný ako reťazec.

2. príklad: Ukážka funkcie CDateFromISO

Sub functionIsDateFromISO  REM začiatok makra
On Error Resume Next  REM ak nastane chyba, nech makro beží ďalej
Dim i As Integer   REM deklarácie premenných
Dim retazec As String
Dim pole()
REM naplňujeme naše pole
pole() = Array(20101012,20160228,20160230,Now,10.5,-1000,"1000","-1000","10.12.1989","10:21","11/12","10:20:55","11/5/1000","21/11/1987","11\11\1111","5 November, 1983 11:12:24","1983.12.12","12.12.1922 15:10:22","15:10:22 12.12.1922")
REM v cykle experimentujeme s funkciou IsDate
For i = LBound(pole()) To UBound(pole())
        retazec = retazec & CStr(i+1) & ". " & pole(i) & " ->  "
        retazec = retazec & CDateFromISO(pole(i))
        retazec = retazec & Chr(10)
Next 
REM výpis na obrazovku 
MsgBox retazec
End Sub   REM koniec procedúry

Testovanie funkcie CDateFromISO Testovanie funkcie CDateFromISO

Rozbor makra:
2. 20160228 -> 28.02.2016 – úspešný prevod
3. 20160230 -> – 30. február vážne neexistuje
4. 01.03.2018 00:30:54 -> – tento prípad a všetky nasledujúce nepredstavujú zápis dátumu v ISO 8601 forme

(Jako ve škole) Průměr: 1.00 | Hodnotilo: 1
 

Komentáře

user avatar neutr
Odpovědět
Programovanie makier v LibreOffice: Bližší pohľad na dátum a čas – funkcie CDateToISO a CDateFromISO
2. 03. 2018, 19:24:19
Opravdu dobře podané a poučné.


Já bych jenom doplnil že tyto funkce se dají používat zejména při přenosech směrem z Calcu > CSV a opačně CSV > Calc.

Existuje sice problém s čísly v textové formě, ale to je řešitelné. Přes to datumy z cizích zdrojů často chodí ve formě čísla 43161 - což je dnešní datum 2.3.2018, které by se v formě ISO mělo objevit jako 20180302. Klasické číslo přečte formát buňky většinou správně v každé lokalizaci a o ISO nejde.

Navíc k takovému celému číslu se uvádí čísla za desetinnou čárkou (ve skutečnosti je to v CSV tečka). Jde o čas.

Je pravdou, že číslo 43161 těžko někdo identifikuje jako datum. To se musí poznat ze záhlaví (popisu). Ve formě ISO je datum celkem dobře čitelené i bez separátorů a asi každého napadne že by mohlo jít o datum.

ISO formát má ještě výhodu v tom, že je to jednoznačné. Klasické číslo může začínat ve 3 různých datumech a když se nastaví špatné datum startu tak se lidé diví. Takže oba systémy mají svá pro a proti, ale ISO vychází ze známých nedostatků klasického zadání.

Čas bývá používán spolu s datumem jen zřídka a když už tak většinou jako časové razítko Datum + čas až na vteřiny, ale někdy jsou požadovány jen hodiny, nebo až minuty.

Zase v CSV se můžeme také setkat s datumem dd/mm/rrrr. To je právě kvůli přenositelnosti. Je to správně i když ne vždy je takto datum vyjádřeno.
Přiznám se k tomu, že když toto převádím, (je nutné očistit znaky od mezer a někdy také od jednoduché či a dvojitých uvozovek) tak při tom provedu náhradu ":" za "/". Je to zvyk ale použít ISO by značně proces zjednodušilo. Musím se také poučit :-)

Díky
user avatar lp.
Odpovědět
Programovanie makier v LibreOffice: Bližší pohľad na dátum a čas – funkcie CDateToISO a CDateFromISO
3. 03. 2018, 23:15:04
Zkusil jsem zadat několik datumů podle iso 8601:

20101012 -> 12.10.2010 (ok)
2016-02-28 -> 28.02.2016 (ok)
2018063 -> (4.2.2018)
2018W033 -> (17.1.2018)
2018W033T110845 -> (17.1.2018 11:08:45)
--0301 -> 01.03.1900 (1.3.2018 -- = akt rok)
1001 -> 01.10.1900 (nejednoznačné, např. rok 1001 nebo čas 10:01:00)

Funkce CDateFromISO toho moc neumí. Občas vrací chybný výsledek.
Její použití bych moc nedoporučil. Lépe je napsat si vlastní funkce.

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Eduard Boldižár

Eduard Boldižár

Som redaktorom stránky astrotech.cz. Mám 24 rokov. Čas trávim v IT škole. Medzi moje záľuby patrí astronómia, sci-fi literatúra a programovanie.

 
 
 
woo jaw demo hz