PHP – DateTime

Aktualizováno: 24. 4. 2020, datum vydání: 24. 2. 2013

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.

Další články