Autor Zpráva
Lukáš1
Profil *
Zdravím,

dělám web pro lidi z více časových pásem a abych předešel problémům se špatným časem, rozhodl jsem se ukládat do MySQL DB všechny události v UTC. Tedy nehledě na to, jestli někdo píše z USA nebo z ČR, uložím čas v UTC a až při načítání času řeším převod do toho časového pásma, ve kterém je aktuální návštěvník.
Předpokládám, že asi nic lepšího nevymyslím - nebo má někdo jiný nápad jak to řešit?

Problém je ale v tom, že používám u některých DB tabulek výchozí hodnotu CURRENT_TIMESTAMP a rád bych aby tato "funkce" vracela čas v UTC. Stejně tak samozřejmě potřebuji aby všechny časové funkce vracely čas v UTC.

Nechci ale časové pásmo na UTC nastavit pro celý MySQL server, ale pouze pro ten jeden web. Zkoušel jsem to řešit takto:

mysql_query('SET time_zone = "+00:00"');

i takto:

mysql_query('SET SESSION time_zone = "+00:00"');

Ale při ukládání do tabulky s CURRENT_TIMESTAMP se pořád ukládá čas v mém (SYSTEM) časovém pásmu. Kde dělám chybu? Jak mám tento problém řešit?
Kajman
Profil
A spoušíte ten příkaz k nastavení tz po každém connectu?
Lukáš1
Profil *
Ano, mám inicializační soubor, který je volán každým scriptem. V něm je samotné připojení k MySQL DB a hned pod tím tento SQL.
Z toho co píšete tuším, že to co popisuji je správný postup. Tak že bych měl jen někde chybu? :D


Teď jsem zkoušel:
SELECT CURRENT_TIMESTAMP()
a ten mi UTC čas vrací, ale INSERT do tabulky vyplní lokální čas.


Pokud mám u toho sloupce ON UPDATE CURRENT_TIMESTAMP, tak se taky při updatu vkládá lokální čas.
Lukáš1
Profil *
Tak teď už jsem zmaten úplně :D

Zjistil jsem, že když dám ten SQL dotaz:

SET time_zone = "+00:00"

A pod ním zavolám dotaz:

UTC_TIMESTAMP()

Tak mi i tato funkce vrazí lokální čas! :O Když SET time_zone nenastavím, tak funkce UTC_TIMESTAMP() vrací UTC čas.
Kajman
Profil
Ještě může být špatně nastavená časová zóna přímo na tom serveru. Zkuste kontaktovat podporu, takhle by se to chovat nemělo.
Lukáš1
Profil *
No - kterou podporu? Toto co popisuji, se děje na mém lokále (MySQL 4.1.2).

Teď jsem to zkoušel ještě na svém serveru (stejná verze MySQL):

  print_r(mysql_fetch_assoc(mysql_query('SELECT CURRENT_TIMESTAMP()')));
  mysql_query('INSERT INTO test VALUES ()');
  mysql_query('SET SESSION time_zone = "+00:00"');
  print_r(mysql_fetch_assoc(mysql_query('SELECT CURRENT_TIMESTAMP()')));
  mysql_query('INSERT INTO test VALUES ()');

A chová se to o něco lépe, ale skoro stejně blbě. Výpis CURRENT_TIMESTAMP() se chová dle očekávání - tedy před změnou pásma lokální čas a po změně UTC.
v testovací tabulce se ale pomocí DEFAULT CURRENT_TIMESTAMP vždy vložil lokální čas. Tzn. zatím stejné chování.

Když ale volám před a po změně pásma funkci UTC_TIMESTAMP(), tak mě v obou případeh vrací UTC čas - zde je to zlepšení.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: