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.