Queste risposte non sono buone. Non conosco un modo portatile per farlo.
Per Linux qui è un'opzione: https://bojanz.wordpress.com/2014/03/11/detecting-the-system-timezone-php/
La data soluzione gli altri stanno elencando potrebbe non essere accurato come il problema è in Linux e l'utilità data (gnuutils, gnulib) erediterà lo stesso problema.
Se si imposta il fuso orario in Europa/Berlino e quindi chiedere la data per il fuso orario che mi darà CET.
Il modo per ottenere il fuso orario in Linux è come questo:
#include <time.h>
#include <stdio.h>
extern char *tzname[2];
extern long timezone;
extern int daylight;
void main() {
tzset();
printf(tzname[0]);
}
Il problema è che i file di zona non includono il loro nome, solo l'elenco dei fusi orari genitore o qualcosa del genere.
CET non è la stessa della zona Europa/Berlino. Se metto CET in date, le date possono essere calcolate in modo errato. A volte questo non importa come alcuni paesi hanno utilizzato un fuso orario per decenni, ma a volte può essere importante.
Utilizzando Zdump ecco un diff tra CET e Europe/Berlin:
> Fri Mar 31 23:06:31 1893 UTC = Fri Mar 31 23:59:59 1893 LMT isdst=0 gmtoff=3208
> Fri Mar 31 23:06:32 1893 UTC = Sat Apr 1 00:06:32 1893 CET isdst=0 gmtoff=3600
< Sun Sep 16 00:59:59 1945 UTC = Sun Sep 16 02:59:59 1945 CEST isdst=1 gmtoff=7200
< Sun Sep 16 01:00:00 1945 UTC = Sun Sep 16 02:00:00 1945 CET isdst=0 gmtoff=3600
< Sun Apr 3 00:59:59 1977 UTC = Sun Apr 3 01:59:59 1977 CET isdst=0 gmtoff=3600
... SNIP about a dozen ...
< Sun Sep 30 01:00:00 1979 UTC = Sun Sep 30 02:00:00 1979 CET isdst=0 gmtoff=3600
> Wed May 23 23:59:59 1945 UTC = Thu May 24 01:59:59 1945 CEST isdst=1 gmtoff=7200
... SNIP couple dozen...
> Sun Oct 2 01:00:00 1949 UTC = Sun Oct 2 02:00:00 1949 CET isdst=0 gmtoff=3600
Alcuni di questi potrebbe anche non importa se si sta utilizzando un unixtime ma si può chiaramente vedere qui che negli anni '70 qualcuno vorrebbe . Ci sono probabilmente alcuni altri fusi orari con modifiche molto più recenti che si interromperanno utilizzando il risultato di tzset. Per molti questo sarebbe un problema marginale, ma se ti influenza il risultato probabilmente non sarà piacevole.
Non so cosa sia la convenzione per Windows o se c'è lo stesso problema. C'è un'eccezione a questo problema. Se il fuso orario del sistema è uno dei principali (come GMT, UTC, CET, ecc.), Allora non penso che questo problema dovrebbe verificarsi.
Tuttavia la tua domanda è in ultima analisi, su MySQL:
SELECT IF(@@global.time_zone = 'SYSTEM', @@global.system_time_zone, @@global.time_zone) AS time_zone;
Se è impostato su SYSTEM sarà anche subire la stessa sorte di PHP e tzset. Ho controllato il server di un amico e c'è spesso differenza di un'ora perché MySQL converte Europa/Londra in GMT. GMT non include BST che è causa di molti problemi. Internamente MySQL potrebbe andare bene perché usa ancora/etc/localtime che punta al file giusto anche se MySQL riporta il nome sbagliato ma se prendi quel nome sbagliato e lo usi per caricare il fuso orario con qualcos'altro allora i due potrebbero non avere lo stesso fuso orario.
Anche se si è tentato di includere DST, non sarebbe una soluzione perfetta. Se l'istanza MySQL utilizza SYSTEM, potresti voler vedere se è possibile convertire le date da quella in UTC (o la data/ora del PHP) che potrebbero essere dolorose per le prestazioni. In teoria potresti provare a rilevare la forza bruta, ma non lo consiglierei. Puoi anche provare a impostare il fuso orario nella variabile di sessione e MySQL potrebbe convertirsi automaticamente, ma stai attento a essere sempre sicuro e sempre RTM (se non funziona usa la fonte).
Quale sistema operativo si desidera eseguire? – alexn