Z pamiętniczka idioty cz.2

Posted on Sat 02 September 2006 in Pamietniczek • 2 min read

Siedzi sobie idiota nad timestampami. Przesyła aktualną datę w formie timestampa z browsera

var now = new Date();
var timestamp = parseInt(now.getTime()/1000);

do skryptu w PHP-ie, a ten wywołuje zapytanie do MySQL-a, w którym korzysta z konwersji na właściwą strefę czasową:

DATE_FORMAT(CONVERT_TZ(FROM_UNIXTIME(gmtstamp) \
,'+00:00','$nsign$tzoh:$tmodulo'),'%d-%m %H:%i'

gdzie $nsign to +/-, $tzoh to godziny offsetu, a $tmodulo to minuty offsetu.

Wszystko ładnie i pięknie tylko idocie coś nie pasuje. Niby z bazy wybierane są właściwe rekordy ale konwersja na strefę czasową działa TYLKO w przypadku gdy system w którym działa browser jest w CEST czyli u nas, w Polsce (GMT +0200).

Idiota ślęczy nad funkcją, wnerwia się na JavaScript (JS - powinni tego zabronić), szuka przyczyn swoich niepowodzeń. Po kilku godzinach, z doskoku, pomiędzy zabawą z Dziedzicem, idiota dochodzi do wniosku, że winna jest funkcja MySQL-a.

W trakcie swoich ślamazarnych prób debugowania, idiota wyświetla w oknie przeglądarki timestampa z JavaScriptu (podzielonego przez tysiąc bo JS używa milisekund), kopiuje tego timestampa i w sesji po SSH na serwerze MySQL przelicza timestampa na normalną datę (mysql> select from_unixtime('1157218703');). Wyniki uzyskuje różne, czasem przesunięte względem prawidłowych o kilka godzin. Od pierwszych chwil, idiota podejrzewa, że zawinił JavaScript. Po jakimś czasie idiota postanawia sprawdzić timestampa z JS lokalnie za pomocą polecenia date (date -r 1157218703) - i uzyskuje prawidłową datę. Acha! Idiota sięga po manual do MySQL-a i...

...i wyczytuje:

Beginning with MySQL 4.1.3, the CURRENT_TIMESTAMP(), CURRENT_TIME(), CURRENT_DATE(), and FROM_UNIXTIME() functions return values in the connection's current time zone, which is available as the value of the time_zone system variable. In addition, UNIX_TIMESTAMP() assumes that its argument is a datetime value in the current time zone. See Section 5.10.8, “MySQL Server Time Zone Support�.

(podkreślenia idioty)

No more questions, wysoki sądzie.