Portál AbcLinuxu, 12. května 2025 17:03
Ahoj, mam nasledujuci dotaz, ked zaznamenavam do db data z casovou znackou UTC, nasledne v aplikacii sa mi tento cas zobrazuje spravne s posunom +2 hod. Otazka znie, ked Spravym dotaz na databazu, v ktorom bude fixne vystupovat timestamp, odcita sa mi od tohoto casu casovy posun, alebo nie?
Nevím jak která databáze (nebylo uvedeno), ale timestamp je datový typ uchovávající většinou počet jednotek od nějakého data.
Tím pádem nemá údaj o časovém pásmu a předpokládal bych že se většinou zobrazí bez jakéhokoliv posunu, to znamená zapíši li tam například datum a čas přes NOW()
vloží se tam 2009-08-21 13:30:00.
a to tam bude a bez konverze se takto i vypíše bez ohledu na nastevní časové zóny v systému.
Ale například u MySql s sql_mode=MAXDB
je typ TIMESTAMP
v db zapisován jako typ DATETIME
.
Postgre, jestli se nepletu, ukládá TIMESTAMP
jako čas UTC a pokud není explicitně vynucena časová zóna při deklaraci datového typu TIMESTAMP with time zone
, použije se systémová, takž Postgre má v TIMESTAMP čas uložen vždy UTC, ale pro výpis se aplikuje systémová zóna nebo definovaná (doufám že jsem to nepoplet).
Záleží o co Vám přesně jde...
Ide o to ze ak si dam vypisat timestamp, a potom ho prekonvertujem cez utilitku "date" dostanem spravny cas. Ked vsak robim select a pouzijem funkciu db "from_unixtime" tak tam mam posun -5 hod. Db pouzivam MySql.
To je docela guláš..., vo co Vám go ?
Co je utilitka date
fce nějakého progr. jazyku ?
Jak se záznamy do db dostanou (přiložte kód a sql dotaz) ?
Jak se záznamy z db vybírají (přiložte kód a sql dotaz) ?
PS: Timestamp se z MySql vypisuje ve formátu YYYY-MM-DD HH:MM:SS
, pokud se přičte 0 dostane se reálné číslo. MySql funkce from_unixtime() konvertuje běžný 32bit integer do textové reprezentace datumu a času YYYY-MM-DD HH:MM:SS
.
MySql a unix timestamp jsou rozdílně uložené záznamy a neexistuje převod 1:1,
zkuste si například:
SELECT UNIX_TIMESTAMP('2009-03-29 02:00:00'); SELECT UNIX_TIMESTAMP('2009-03-29 03:00:00');
vrátí to stejný výsledek 1238288400 (posun na letní čas...).
kdežtože
SELECT TIMESTAMP('2009-03-29 02:00:00') + 0; SELECT TIMESTAMP('2009-03-29 03:00:00') + 0;
vrátí rozdílné výsledky.
No mne
SELECT UNIX_TIMESTAMP('2009-03-29 02:00:00');
vratilo 1238310000
a
SELECT UNIX_TIMESTAMP('2009-03-29 03:00:00'); vrat 1238313600
No vidíte a mně oba 1238288400 jak na widlich (XP, MySql 5.0.45-community-nt ) tak na Linuxu (SuSe 11.1, MySql 5.0.67).
Sice nerozumím tak velkému rozdílu, ale je z toho patrné, že fce UNIX_TIMESTAMP() vrací hodnotu závislou na nastavení systému, takže její kombinace s DB a aplikačním prostředím musí být správná a nemusí být přenositelná (nebo naopak přenositelnost zajistí :) ).
Nicméně to neřeší Váš problém, u kterého by stačilo přiložit kousek kódu a hned by bylo jasněji.
Peto predpokladam, ze myslis program date na linuxovej konzole, databaza zapisuje urcite spravne, chyba bude v rozdielnom nastaveni narodnych prostredi operacneho systemu a databazoveho systemu v danom pripade MySQL.
pozri si napriklad cez phpMyAmin premenne databazoveho systemu systemu
Konkretne si pozri
lc time names
potom zadaj an konzole pokial pouzivas linux prikaz locale
vrati ti nieco taketo vsimni si LC_TIME, hodnoty by mali byt totozne
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
Pokial pouzivas ako klienta este trebars php skontroluj si locale aj v nom
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.