Jak na DATETIME v Nette/dibi?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ondřej Mirtes
Člen | 1536
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Ř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).