Nette datum ve tvaru: -0001-11-30 00:00:00
Narazila jsem na problém plnění hodnot z databáze do formuláře. V databázi jsem použila typ DATE, který je ve formátu 0000-00-00. Tato nulová hodnota jde do databáze bezproblémů uložit, pokud není databáze nastavena na NO ZERO DATE
tak, že to zakazuje. Asi bychom měli správně do databáze nulové údaje nedávat, zabránit jejich vložení a vyžadovat použití hodnoty NULL. K uložení této hodnoty 0000-00-00 také dojde, pokud se snažíme přímo v databázi uložit nesmyslné datum.
Při načtení této hodnoty 0000-00-00 z databáze MySQL pomocí Nette se ve formuláři či výpisu hodnot tabulky zobrazí údaj:
-0001-11-30 00:00:00
Použila jsem propojení na databázi přes instanci třídy Nette\Database\Context přes metodu table a dále případně pomocí metody get
pro zobrazení konkrétního id.
Konkrétní vrácená hodnota datového soupce je typu Nette\DateTime
. Výpis ve formě data a času je ovlivněn převodem v metodě Nette\DateTime::__toString()
.
Tato třída dědí klasické metody od PHP DateTime včetně případné statické metody DateTime::format
, pomocí které lze případně naformátovat datum do požadovaného tvaru. Pokud chci mít ve výpisech pouze formát DATE, musím se postarat o přeformátování. Přeformátovat v PHP přímo výstup proměnné $row
z databáze se mi nedaří, laděnka mi hlásí „ActiveRow is read-only; use update() method instead.“. Metoda update() ale mění data už přímo v databázi. Přeformátování vypisovaných hodnot třeba v tabulkách je jednoduché, lze zajistit pomocí helperů. Pokud jde o data načítaná automaticky do formulářů, tam je situace o něco složitější. Elegantně to lze vyřešit následovně.
<?php ... $form->setDefaults($row); $form['datum']->setDefaultValue($row->datum->format('Y-m-d')); ... ?>
V $row
máme výsledek databázového dotazu získaný za použití metod třídy Nette\Database\Context
.
Pokud by šlo pouze o převod DATETIME
na DATE
, tak by mělo jít použití SQL příkazu, kde použijeme funkci
CONCAT(‚nazev_sloupce_date‘) AS date
Ale do SQL dotazů se mi zasahovat nechce…
PHP: 1970-01-01 01:00:00
Jde o podobný problém, jaký se vyskytuje s převodem nulové hodnoty v PHP v případě kódu:
<?php echo date('Y-m-d H:i:s', strtotime('0000-00-00 00:00:00')); ?>
Zde se pro změnu vypisuje:
1970-01-01 01:00:00
Prakticky to není chyba, chová se tak Unix. Holt takto počítá čas, začíná rokem 1970.
Další informace
- Bug #60257 ZERO DATES IN STRTOTIME – bugs.php.net
- Datum ‚0000–00–00‘ se mi vypisuje v inputu jako ‚-0001–11–30‘ – forum.nette.org
- Formuláře setDefaults() místo 2012–09–08 vrací 2012–09–08 00:00:00 – forum.nette.org
- input->setDefaultValue() – čas a datum – forum.nette.org
- DateTime a vychozi format v sablone – forum.nette.org
- Validace Data/času ve formuláři – forum.nette.org
- Divné chování při formátování datumu – forum.dibiphp.com
Doplňky, pluginy a komponeney k Nette
- Dateinput, DateTimePicker – addons.nette.org