Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Obsługa stref czasowych
Forum PHP.pl > Forum > Przedszkole
tomahawk
Witam.

Głowie się od pewnego czasu nad obsługą stref czasowych.

Ogólnie sprawa wygląda tak że zapisuję zawsze do bazy datę w formacie unixowym dla strefy GMT +0. Czyli ustawiam w php strefe czasu na na Europe/Dublin i to co zwraca time() wrzucam do bazy.

Teraz tylko przy wyświetlaniu pobieram ten czas i dodaje do niego 3600 razy przesunięcie godzinowe strefy czasowej która wybrał użytkownik.

Wszystko jest cacy... tylko że po zmianie czasu np. z zimowego na letni już nie będzie.
Na dodatek w tej samej strefie czas zimowy i letni trwa różnie... tzn. u nas jest teraz zimowy a gdzieś daleko na południe (w tej samej strefie) mają letni nerdsmiley.png

Jak to wszystko poskładać żeby nikt nie osłupiał od złej daty?

I czy ten manual php.net jest świetny czy jednak rzeczywiście nie ma tam informacji czy czas z time() jest zimowy czy letni? No właśnie jaki jest?

Oczywiście nie chcę tak żeby użytkownik musiał stale pilnować jaki ma czas i zmieniać z zimowego na letni i odwrotnie. On ma tylko raz ustawić sobie strefę.
Noidea
Użyj klas DateTime i DateTimeZone (ewentualnie odpowiedników w postaci funkcji). Mają one wbudowaną obsługę czasu letniego. Przykładowo Polska(Warszawa) leży w tej samej strefie czasowej co Namibia(Windhuk) - http://pl.wikipedia.org/wiki/UTC%2B1:00 - oba te państwa używają czasu letniego, ale leżą na dwóch różnych półkulach, więc przechodzą na czas letni w innym momencie. Pomimo to DateTime sobie z tym radzi:
http://ideone.com/rF8iV


Cytat
I czy ten manual php.net jest świetny czy jednak rzeczywiście nie ma tam informacji czy czas z time() jest zimowy czy letni? No właśnie jaki jest?

time() zwraca liczbę sekund które upłynęły od 1 stycznia 1970 00:00:00 GMT. Liczba sekund nie ma wersji letniej i zimowej.
tomahawk
No fakt jeżeli dam

$warsawTime = new DateTime( "now", $warsawTZ );

To data jest jak najbardziej poprawna.
Ale jeżeli chcę wyświetlić jakąś inną datę to co mam dać zamiast "now" ?
Próbowałem dać tam znacznik czasu z time() (zapisany wcześniej do bazy danych) i niestety np. dla naszej strefy godzina jest błędna (1h za mało).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.