2011-12-03 29 views
7

PHP date() & time() powrót nieprawidłowy czas:PHP zła data/czas

Kiedy date.timezone = "Europe/Riga" czas zwrócony przez date() był 03-12-2011 08:57:12, ale czas systemowy był 03-12-2011 01:57:12 (strefa czasowa Europa/Ryga - prawidłowy czas w tym momencie). Kiedy zmieniła strefę czasową "Europa/Londyn", czas zmienia się 03-12-2011 06:57:12 (rzeczywisty czas 02-12-2011 23:57:12)

czas zwrócony przez date/hwclock --show była prawidłowa (03-12-2011 01:57:12 ze strefy czasowej systemu ustaw Riga)

OS: Debian 6.0

Sprawdziłem większość pytań dotyczących podobnych problemów w SO/Google, ale wszystkie mają błędną strefę czasową.

O ile wiem, jest problem między php -> os. Oczywiście, ponieważ nieprawidłowe przesunięcie czasowe jest zawsze stałe, mogę odjąć różnicę, ale nie jest to właściwe rozwiązanie.

Wszelkie pomysły będą bardzo mile widziane.

+1

Czego używasz do swojej wartości 'date()'? na przykład 'date ('Ymd H: i: s')' –

+1

Tak - 'date ('Ymd H: i: s')' – relic

+0

Co się stanie, jeśli użyjesz klasy 'DateTime' w celu określenia daty w połączeniu z' DateTimeZone' ? Na przykład '$ d = new DateTime ('', new DateTimeZone ('Europe/Riga')); echo $ d-> format ("Y-m-d H: i: s"); ' –

Odpowiedz

3

Problem wygląda podobnie do tego, co widziałem na jednym z moich serwerów. Wygląda na to, że podoba mi się bug in php 5.3.2-1. Spróbuj uruchomić skrypt php w raporcie o błędzie i opublikuj wyniki.

+1

Wygląda na to, że nie był to prawdziwy błąd. Reporter po prostu miał inny kod, który resetował domyślną strefę czasową. Tak ważny w tym sensie, że powinieneś na to uważać. Bądź świadomy kodu i ustawień .ini, które mogą mieć wpływ. – ficuscr

10

Czytanie podręcznika PHP wydaje się, że ustawienia w pliku date.timezone zależą od ustawień w pliku php.ini. Istnieje również inny sposób ustawienia domyślnej strefy czasowej we wszystkich funkcjach daty/czasu i jest to date_default_timezone_set. Spróbuj ustawić go z:

date_default_timezone_set('Europe/Riga'); 

zamiast swojego date.timezone kodu.

+0

Dzięki. Ale już wypróbowałem to bez powodzenia. Fakt, że kiedy zmieniłem strefę czasową z Rygi na Londyn, różnica czasu wynosiła 2 godziny sugeruje, że wybór strefy czasowej "działa", ale problem dotyczy początkowej wartości czasu. – relic

2

Strefa czasowa systemu może być niepoprawna. Powoduje to przesunięcie w czasie określonym przez funkcję date() PHP, mimo że zarówno php date.timezone (w php.ini), jak i czas systemowy serwera są poprawne.

-4

Czas PHP jest oparty na skali czasu epoki, która używa GMT, a następnie UTC. Większość ludzi nazywa teraz czas unixowy. Ponieważ PHP używa czasu unixowego, strefy czasowe nie są używane. Uważam, że odjęcie godzin strefy czasowej w sekundach jest właściwą metodą dostosowania się do różnic.

+0

Czas Unix to prosta liczba od ustalonego momentu - strefa czasowa nie ma na nią żadnego wpływu. Dodatkowo PHP ma całkiem przyzwoitą obsługę strefy czasowej; nie ma absolutnie żadnego powodu, aby to pominąć i napisać własną. –

-2

Musisz ustawić date.timezone w php.ini i zrestartować serwer http://php.net/manual/en/timezones.php

+0

To jest dokładnie to, co oznaczało PO, kiedy powiedział "date.timezone =" Europe/Riga "'. –

1

miałem jakiś problem ze zbyt strefy czasowej. To może być przydatne dla kogoś.

W moim przypadku czas Sumer czasu w Chile zwrócił nieprawidłowe przesunięcie czasowe.

Zaktualizowano dla mnie timezonedb.

Przejdź do: https://pecl.php.net/package/timezonedb

Dla Widnows Pobierz najnowszą wersję dll, skopiować do katalogu "EXT". Edytuj php.ini i umieścić poniżej linii:

extension = php_timezonedb.dll

dla Linux Można użyć:

pecl zainstalować timezonedb

i umieścić w php.ini:

przedłużacza = php_timezonedb.so