Strefy czasowe są ważnym elementem personalizacji serwisów międzynarodowych. Dzięki ich obsłudze goście z różnych krajów będą mogli zobaczyć czasy dodania/zmiany itd. rozmaitych elementów w godzinach, jakie panują właśnie u nich. Wbrew pozorom napisanie ich implementacji nie jest wcale trudne - wystarczy tylko pomysł. Jaki? O tym jest ten tekst...
Zazwyczaj daty różnych zdarzeń w serwis|serwisie przechowywane są po prostu jako liczba sekund od 1.1.1970. Wartość taką można pobrać przy pomocy funkcji
time() lub (w przypadku zapytań SQL)
UNIX_TIMESTAMP(). Format jest to dość wygodny, gdyż umożliwia nam szybkie sformatowanie późniejszej daty według naszych kryteriów. Jednak można to także wykonać w zapytaniach, w dodatku na danych w "oficjalnym" typie zapisu daty:
DATE. Ale gdy do akcji wejdą strefy czasowe, korzystniej jest wykorzystać pierwszy opisany tu sposób. Dlaczego?
Jedna godzina to 3600 sekund. Stref czasowych mamy natomiast 33 (wliczając w to strefy czasu lokalnego). Każdą z tych stref określa pewien współczynnik opisujący, o ile godzin przesuwany jest czas w stosunku do czasu GMT. Przykładowo dla naszej strefy wynosi on "+1" zimą i "+2" latem. Na Nowej Fundlandii w Kanadzie ma on natomiast wartość "-3.5". Cała sztuczka polega na tym, by napisać własny zamiennik dla funkcji
date(), który wprowadzony czas przepuści dodatkowo przez takie obliczenie:
$czas + 3600 * $wspolczynnik_strefy |
Gdy połączymy to z funkcją
gmdate(), która wprowadzony czas traktuje jako czas na strefie GMT (czyli centralnej), otrzymamy w pełni działający filtr pokazujący datę w takiej strefie czasowej, w jakiej zażyczył sobie użytkownik. Oto przykładowy kod w PHP:
<html>
<head>
<title>Strefy czasowe</title>
</head>
<body>
Wybierz swoja strefe czasowa:
<form method="post" action="strefa.php">
<select name="tz">
<option value="-12">GMT - 12 Hours</option>
<option value="-11">GMT - 11 Hours</option>
<option value="-10">GMT - 10 Hours</option>
<option value="-9">GMT - 9 Hours</option>
<option value="-8">GMT - 8 Hours</option>
<option value="-7">GMT - 7 Hours</option>
<option value="-6">GMT - 6 Hours</option>
<option value="-5">GMT - 5 Hours</option>
<option value="-4">GMT - 4 Hours</option>
<option value="-3.5">GMT - 3.5 Hours</option>
<option value="-3">GMT - 3 Hours</option>
<option value="-2.5">GMT - 2.5 Hours</option>
<option value="-2">GMT - 2 Hours</option>
<option value="-1">GMT - 1 Hours</option>
<option value="0">GMT</option>
<option value="1">GMT + 1 Hour</option>
<option value="2">GMT + 2 Hours</option>
<option value="3">GMT + 3 Hours</option>
<option value="3.5">GMT + 3.5 Hours</option>
<option value="4">GMT + 4 Hours</option>
<option value="4.5">GMT + 4.5 Hours</option>
<option value="5">GMT + 5 Hours</option>
<option value="5.5">GMT + 5.5 Hours</option>
<option value="6">GMT + 6 Hours</option>
<option value="6.5">GMT + 6.5 Hours</option>
<option value="7">GMT + 7 Hours</option>
<option value="8">GMT + 8 Hours</option>
<option value="9">GMT + 9 Hours</option>
<option value="9.5">GMT + 9.5 Hours</option>
<option value="10">GMT + 10 Hours</option>
<option value="10.5">GMT + 10.5 Hours</option>
<option value="11">GMT + 11 Hours</option>
<option value="12">GMT + 12 Hours</option>
</select>
<input type="submit" value="OK"/>
</form>
<?php
if(isset($_POST['tz'])){
$strefa_czasowa = $_POST['tz'];
function my_date($format, $time = 0){
global $strefa_czasowa;
if($my_time == 0){
$my_time = time();
}
return gmdate($format, $my_time + 3600 * $strefa_czasowa);
} // end my_date();
echo 'Czas w strefie '.$_POST['tz'].': <b>'.my_date('d.m.Y, H:i').'</b>';
}
?>
</body>
</html> |
Nie bój się modyfikować tego kodu. Pamiętaj, że nie zaleca się przepisywać jednej zmiennej do drugiej bez potrzeby. Powyżej natomiast zrobiłem to (
$strefa_czasowa = $_POST['tz']) tylko, by pokazać, co trzeba wstawić do obliczeć i oddzielić to od tego, skąd to wziąłem. Pamiętaj o tym.
W serwisie ustawienie strefy czasowej powinno wyglądać mniej więcej tak: jeżeli jest ktoś zalogowany, pobierz z jego profilu informacje o strefie czasowej i zapisz gdzieś. W przeciwnym wypadku załaduj domyślną strefę czasową.
Ten niezwykle krótki, jak na mnie, artykuł dobiega końca. Mam nadzieję, iż wyjaśniłem dokładnie tajniki związane z obsługą stref czasowych w twoich skryptach.