Tak jsem si trochu pohrála s konstruktorem DateTime::__construct
třídy DateTime
. Zkoušela jsem náchylnost k zadání chybného parametru do konstruktoru. V případě úplně chybného zadání, konstruktor vyvolá výjimku. Nicméně nemůžete na to spoléhat, protože například neexistující datum 30. 2. 2013 bylo uloženo jako 2. 3. 2013!. Datum se uložil o dva dny dál – došlo k jeho posunu. Co se nevešlo do února, tak schlamstnul březen :-). Proto před voláním konstruktoru, pokud si nejste jisti správností formátu, je vhodné volat funkci checkdate
, která by v tomto případě vrátila false
.
Další možností, jak vytvořit instanci třídy DateTime je použití metody DateTime::createFromFormat
. Bohužel metoda pracuje pouze s předem danými formáty, mezi nimiž jsem např. klasické české datum 23. 1. 2013 nenašla. Součástí formátu je např. datum ve tvaru 23.1.13. Takže je asi lepší pracovat nakonec s SQL formátem dat a klasické české datum do tého SQL formy nejprve ručně převést.
Příklad testu na 2013-12-30
<?php try { $datum = new DateTime('2013-12-30'); } catch (Exception $e) { echo $e->getMessage(); exit('
Chybný formát data.'); } echo $datum->format('j. n. Y'); ?>
Spuštění kódu
30. 12. 2013
Příklad testu na 2013-2-5 (tj. bez nul na začátku)
<?php try { $datum = new DateTime('2013-2-5'); } catch (Exception $e) { echo $e->getMessage(); exit('
Chybný formát data.'); } echo $datum->format('j. n. Y'); ?>
Spuštění kódu
5. 2. 2013
Příklad testu na 2013-02-30 – zde je CHYBA PHP!
<?php try { $datum = new DateTime('2013-02-30'); } catch (Exception $e) { echo $e->getMessage(); exit('
Chybný formát data.'); } echo $datum->format('j. n. Y'); ?>
Spuštění kódu
2. 3. 2013
Tento datum v kalendáři neexistuje, přesto došlo k jeho uložení. Jendoduše se datum posunul o neexistující dny dál…
Příklad testu na 2013-aa-30 (chybný formát)
<?php try { $datum = new DateTime('2013-aa-30'); } catch (Exception $e) { echo $e->getMessage(); exit('
Chybný formát data.'); } echo $datum->format('j. n. Y'); ?>
Spuštění kódu
DateTime::__construct(): Failed to parse time string (2013-aa-30) at position 4 (-): Unexpected character Chybný formát data.
Zde byla správně vyvolána výjimka, protože šlo o naprosto chybný formát.