Jak na DATETIME v Nette/dibi?
- Ondřej Mirtes
- Člen | 1536
Ahoj,
nedávno jsem si přečetl v komentářích u dokumentace, že používat
timestamp na ukládání data do databáze je prasárna, protože to není
human-readable. Ale používám ji tak odjakživa a tudíž mi to začalo vrtat
hlavou :)
Práce s timestamp je jednoznačně pohodlná, řeší za mě i problém časových pásem. Kdežto když do databáze, sloupce typu DATETIME, uložím něco jako 2010–02–10 15:00:00, tak vím houby, v jakém časovém pásmu to bylo a může, třeba jen při blbém přechodu z letního času na zimní, docházet k nepřesnostem.
Udělal jsem zkusmo přechod z timestamp na datetime na jednom mém aktuálním projektu a většinu operací jsem vyřešil s minimálními zásahy do kódu:
- při dotazování se na DB stačilo změnit typ proměnné z %i na %t (jako
proměnná mohla figurovat pořád funkce
time()
) - při vkládání do DB jsem musel u klíčů pole doplnit těsně za název
sloupce také %t, což je dost nehezké (
registration_time%t
) - svůj helper time (který mi timestamp formátuje do chtěného formátu) jsem rozšířil o funkčnost, že když mu přijde string, tak do funkce date pošle přijatou hodnotu prohnanou funkcí strftime
S čím ovšem přišel problém, bylo vybírání článků v konkrétním měsíci. Zde se projevil nějaký ten časový offset, protože DB dotaz neviděl článek, který vyšel přesně o půlnoci 1. dne v měsíci. Asi to bylo tím, že jsem se stále dotazoval pomocí timestampu a funkce mktime. Vyřešil by to objekt DateTime? Bohužel vůbec nevím, jak se s ním pracuje, dokumentace PHP je v tomhle nepřehledná. Rád bych tedy z logiky aplikace co nejvíce vykuchal timestamp, doufaje, že vše bude přesně fungovat jako s ní, ale nevím jak na to.
Máte někdo nějaké best-practices pro práci s datumem v Nette a MySQL?
- Jan Tvrdík
- Nette guru | 2595
Timestamp je sice na jedné straně prasárna, ale na druhá straně se
jedná o jednoznačnou identifikaci daného okamžiku v čase. Samotný
řetězec YYYY-MM-DD HH-MM-SS
jednoznačnou identifikací není a
je nutno doplnit další informace, aby se vyřešil problém s letním a
zimním časem. Jak řeší DateTime anomálie jako např. přestupná sekunda
netuším.
- Honza Kuchař
- Člen | 1662
Já teda nevím co tím přesně myslíte, ale v databázi mám odjakživa typ sloupečku TIMESTAMP a je to i z phpMyAdmin (teď teda pgAdmin III) krásně čitelné. Sloupečet typu TIMESTAMP se mi zobrazuje normálně jako datum. Nebo vy myslíte ukládat čistě jako číslo?
- David Grudl
- Nette Core | 8228
Řetězec YYYY-MM-DD HH-MM-SS
jednoznačnou identifikací je,
pokud všude používáme smluvené časové pásmo. Obvykle národní pásmo na
národních webech a UTC/GMT na mezinárodních webech. MySQL mezi časovými
pásmy u typu DATETIME čas nijak nepřevádí, u typu TIMESTAMP ano, ale
tuším, že Ondřej myslel UNIX TIMESTAMP.
S přestupnou sekundou žádný mně známý IT systém nepočítá, takže se s ní není potřeba trápit (což je dobře a stejně by to ani realizovat nešlo).