2011-12-03 10 views
7

PHP date() & time() ritorno tempo non corretta:PHP data sbagliata/ora

Quando date.timezone = "Europe/Riga" il tempo restituito da date() era 03-12-2011 08:57:12, ma il tempo sistema era 03-12-2011 01:57:12 (fuso orario Europe/Riga - Ora esatta, in quel momento). Quando ho cambiato fuso orario a "Europe/London", il tempo è cambiato per 03-12-2011 06:57:12 (tempo effettivo 02-12-2011 23:57:12)

tempo restituito dalla date/hwclock --show era corretta (03-12-2011 01:57:12 con fuso orario del sistema impostato come Riga)

OS: Debian 6.0

Ho controllato la maggior parte delle domande relative a problemi simili su SO/Google, ma sembra che abbiano specificato un fuso orario errato.

Per quanto posso dire c'è un problema tra php -> os. Ovviamente, poiché l'offset dell'ora errato è sempre costante, potrei sottrarre la differenza, ma non è una soluzione adeguata.

Tutte le idee saranno molto apprezzate.

+1

Cosa stai usando per il valore di 'date()'? per esempio. 'date ('Ymd H: i: s')' –

+1

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

+0

Cosa succede se si utilizza la classe 'DateTime' per determinare la data, in combinazione con' DateTimeZone'? ? Ad esempio '$ d = new DateTime ('', new DateTimeZone ('Europe/Riga')); echo $ d-> format ('Y-m-d H: i: s'); ' –

risposta

3

Il problema è simile a quello che ho visto su uno dei miei server. Sembra che piaccia lo bug in php 5.3.2-1. Prova a eseguire lo script php nel rapporto bug e pubblica i risultati.

+1

Sembra che non fosse un bug vero. Il reporter aveva semplicemente un altro codice che stava ripristinando il fuso orario predefinito. Così valido nel senso che dovresti guardarlo per quello. Beaware di codice e impostazioni .ini che possono avere un impatto. – ficuscr

10

Leggere il manuale PHP sembra che il comportamento di date.timezone sia influenzato dalle impostazioni di php.ini. C'è un altro modo per impostare il fuso orario predefinito in tutte le funzioni di data/ora ed è il date_default_timezone_set. Prova a impostare con:

date_default_timezone_set('Europe/Riga'); 

invece del codice date.timezone.

+0

Grazie. Ma l'ho già provato senza successo. Il fatto che quando ho cambiato fuso orario da Riga a Londra, la differenza di fuso orario era di 2 ore, suggerisce che la selezione del fuso orario "funziona", ma il problema è con il valore temporale iniziale. – relic

2

Il fuso orario del sistema potrebbe essere errato. Ciò si traduce in uno spostamento in un tempo dato dalla funzione PHP date(), sebbene sia php date.timezone (in php.ini) sia l'ora di sistema del server siano corretti.

-4

Il tempo di PHP è basato su una scala temporale di epoca che utilizza GMT e successive UTC. La maggior parte delle persone ora si riferisce ad esso come unix time. Poiché PHP usa unix time, i fusi orari non vengono utilizzati. Credo che sottrarre le ore del fuso orario in secondi sia il metodo corretto per regolare le differenze.

+0

Il tempo di Unix è un conteggio semplice da un momento fisso nel tempo, non è influenzato dai fusi orari. Inoltre, PHP ha una gestione del fuso orario abbastanza decente; non c'è assolutamente alcun motivo per saltare e scrivere il proprio. –

-2

è necessario impostare date.timezone in php.ini e riavviare il server http://php.net/manual/en/timezones.php

+0

Questo è esattamente ciò che intendeva l'OP quando ha detto "date.timezone =" Europe/Riga "'. –

1

ho avuto qualche problema con fuso orario troppo. Questo può essere utile per qualcuno.

Nel mio caso, il tempo di esportazione in Cile CLST ha restituito un offset di timzeone errato.

L'aggiornamento del timezonedb ha funzionato per me.

Vai a: https://pecl.php.net/package/timezonedb

Per Widnows scaricare l'ultima versione del dll, copiare nella directory "ext". Modifica il php.ini e mettere sotto la linea:

extension = php_timezonedb.dll

Per Linux È possibile utilizzare:

PECL installare timezonedb

e put php.ini:

estensione = php_timezonedb.so