Ces réponses ne sont pas bonnes. Je ne connais pas de façon portable de le faire.
Pour Linux est une option ici: https://bojanz.wordpress.com/2014/03/11/detecting-the-system-timezone-php/
Les autres solution date énumèrent pourrait ne pas être précis que le problème est sous Linux et l'utilitaire de date (gnuutils, gnulib) héritera le même problème.
Si je règle le fuseau horaire Europe/Berlin et que je demande la date du fuseau horaire, il me donnera CET.
La manière d'obtenir le fuseau horaire dans Linux est comme ceci:
#include <time.h>
#include <stdio.h>
extern char *tzname[2];
extern long timezone;
extern int daylight;
void main() {
tzset();
printf(tzname[0]);
}
Le problème est que les fichiers de zone ne comprennent pas leur nom, seule la liste des fuseaux horaires des parents ou quelque chose comme ça.
CET n'est pas la même que la zone Europe/Berlin. Si je mets CET dans les dates peuvent être calculés incorrectement. Parfois, cela n'a pas d'importance car certains pays utilisent un fuseau horaire depuis des décennies, mais parfois cela peut avoir de l'importance.
L'utilisation zdump ici est un diff entre CET et 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
Certains d'entre eux pourraient ne pas d'importance, même si vous utilisez un unixtime mais vous pouvez voir clairement ici que dans les années 70 Certains . Il y a probablement quelques autres fuseaux horaires avec des changements beaucoup plus récents qui casseraient en utilisant le résultat de tzset. Pour beaucoup, ce serait une question marginale mais si cela vous affecte, le résultat ne sera probablement pas agréable.
Je ne sais pas ce que la convention est pour windows ou s'il y a le même problème. Il existe une exception à ce problème. Si votre fuseau horaire est un root (comme GMT, UTC, CET, etc) alors je ne pense pas que ce problème devrait se produire.
Toutefois, votre question est en fin de compte sur MySQL:
SELECT IF(@@global.time_zone = 'SYSTEM', @@global.system_time_zone, @@global.time_zone) AS time_zone;
Si elle est réglée sur le système, il souffrira le même sort que PHP et tzset. J'ai vérifié le serveur d'un ami et il y a souvent une heure de différence parce que MySQL convertit l'Europe/Londres en GMT. GMT n'inclut pas BST qui est une cause de nombreux problèmes. En interne, MySQL pourrait bien fonctionner car il utilise toujours/etc/localtime pour pointer sur le bon fichier même si MySQL rapporte le mauvais nom mais si vous prenez le mauvais nom et l'utilisez pour charger le fuseau horaire avec autre chose, les deux ne peuvent pas avoir le même fuseau horaire.
Même si vous avez essayé d'inclure DST, ce ne serait pas une solution parfaite. Si vous utilisez MySQL, vous voudrez peut-être voir si vous pouvez convertir les dates en UTC (ou la date et l'heure PHP) ce qui peut être pénible pour les performances. En théorie, vous pouvez essayer de détecter la force brute, mais je ne le conseillerais pas. Vous pouvez également essayer de définir le fuseau horaire dans la variable de session et MySQL peut convertir automatiquement mais assurez-vous d'être sûr et toujours RTM (si cela ne fonctionne pas, utilisez la source).
Sur quel système d'exploitation voulez-vous cela? – alexn