Striktní datum a čas v Nette Utils

David Grudl
Nette Core | 8218
+
+15
-

Na práce s daty v PHP mě vždycky nesmírně štval „overflow mechanism“, tedy že funkce akceptují třeba datum 33. ledna a tiše jej převedou na 2. února. Na první pohled to může vypadat užitečně, ale ve skutečnosti je to pouze zdroj nepříjemností. Může se stát, že někde omylem vyplníte datum třeba 31. dubna, což na první pohled vůbec nevypadá jako chyba, protože kdo si hned uvědomí, že duben má jen 30 dní, a systém to akceptuje a tiše změní na 1. května. To je přesně to, co nikdy nechcete.

Ještě divnější chování má konstruktor DateTime:

new DateTime('2023-04-31') -> převede na 2023-05-01
new DateTime('2023-04-32') -> vyhodí výjimku

Teprve nedávno jsem přišel na to, jak se dá overflow mechanism detekovat a vyhodit výjimku i v prvním případě.

Toto chování bych chtěl doplnit do Nette\Utils\DateTime.

Existuje ale jedna situace, která se na overflow spoléhá. Taky je to teda blbě. Jde o data 0000-00-00 v MySQL. Takové datum neexistuje a když se konvertuje na DateTime, převede se tiše na -0001-11-30. Chci proto upravit Nette\Database, aby v takovém případě místo objektu DateTime vracel NULL.

kminekmatej
Generous Backer | 38
+
+1
-

Odstranení tichého převodu na –0001–11–30 bude mít pozitivní dopad na můj anger management, tedy za mě jednoznačný +1

mystik
Člen | 308
+
+1
-

Zame jedine plus to prevadet na null

Eda
Backer | 220
+
0
-

To zní suprově!

website21
Člen | 1
+
0
-

A jak se to bude chovat ve formulářích, když bude datum null? Už se nebude vypisovat –0001–11–30 a zůstane to pole prázdně?