Sur un serveur, quand je lance:
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2009-05-30 16:54:29 |
+---------------------+
1 row in set (0.00 sec)
Sur un autre serveur:
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2009-05-30 20:01:43 |
+---------------------+
1 row in set (0.00 sec)
J'ai pensé que cela pourrait être utile:
default-time-zone='+00:00'
Pour voir quelle valeur ils sont mis à:
SELECT @@global.time_zone;
Pour définir une valeur, utilisez l’un des deux suivants:
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone = '+00:00';
(L'utilisation de fuseaux horaires nommés tels que "Europe/Helsinki" signifie que vous devez avoir une table de fuseau horaire correctement remplie.)
Gardez à l'esprit que +02:00
est un décalage. Europe/Berlin
est un fuseau horaire (qui a deux décalages) et CEST
est une heure correspondant à un décalage spécifique.
SELECT @@session.time_zone;
Pour le définir, utilisez l'un ou l'autre:
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";
Les deux peuvent renvoyer SYSTEM, ce qui signifie qu'ils utilisent le fuseau horaire défini dans my.cnf.
Pour que les noms de fuseau horaire fonctionnent, vous devez configurer vos tables d’information de fuseau horaire: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . Je mentionne également comment remplir ces tables dans cette réponse .
TIME
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
Il retournera 02:00:00 si votre fuseau horaire est +2: 00.
SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(NOW());
SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`
SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`
Remarque: la modification du fuseau horaire ne modifiera pas l'heure de la date ou l'horodatage stocké , mais affichera une date et un heure différentes pour les colonnes d'horodatage existantes, car elles sont stockées en interne au format UTC. horodatages et affichés en externe dans le fuseau horaire actuel de MySQL.
J'ai fait une feuille de triche ici: Le fuseau horaire de MySQL doit-il être défini sur UTC?
Pour ceux qui ont encore ce problème:
value="jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC"
Travaillé pour moi Il suffit d’ajouter ?serverTimezone=UTC
à la fin.
Pour le définir pour la session en cours, faites:
SET time_zone = timezonename;
Lorsque vous pouvez configurer le serveur de fuseau horaire pour MySQL ou PHP:
Rappelles toi:
Changer le système de fuseau horaire. Exemple pour Ubuntu:
$ Sudo dpkg-reconfigure tzdata
Redémarrez le serveur ou vous pouvez redémarrer Apache 2 et MySQL:
/etc/init.d/mysql restart
Exécutez-le simplement sur votre serveur MySQL:
SET GLOBAL time_zone = '+8:00';
Où +8: 00 sera votre fuseau horaire.
Ce travail pour moi pour un emplacement en Inde:
SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
Vous pouvez spécifier le fuseau horaire par défaut du serveur lorsque vous le démarrez, voir http://dev.mysql.com/doc/refman/5.1/fr/server-options.html et plus précisément le --default-time-zone=timezone
option. Vous pouvez vérifier les fuseaux horaires globaux et de session avec
SELECT @@global.time_zone, @@session.time_zone;
définissez l'un ou les deux à l'aide de l'instruction SET
, & c; Voir http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html pour plus de détails.
Gardez à l'esprit que 'Pays/Zone' ne fonctionne pas parfois ... Ce problème ne dépend pas du système d'exploitation, de la version de MySQL ni du matériel - je le connais depuis FreeBSD 4 et Slackware Linux de 2003 à aujourd'hui. MySQL de la version 3 au dernier tronc source. C'est ODD, mais ça arrive. Par exemple:
root@Ubuntu# ls -la /usr/share/zoneinfo/US
total 8
drwxr-xr-x 2 root root 4096 Apr 10 2013 .
drwxr-xr-x 22 root root 4096 Apr 10 2013 ..
lrwxrwxrwx 1 root root 18 Jul 8 22:33 Alaska -> ../SystemV/YST9YDT
lrwxrwxrwx 1 root root 21 Jul 8 22:33 Aleutian -> ../posix/America/Adak
lrwxrwxrwx 1 root root 15 Jul 8 22:33 Arizona -> ../SystemV/MST7
lrwxrwxrwx 1 root root 18 Jul 8 22:33 Central -> ../SystemV/CST6CDT
lrwxrwxrwx 1 root root 18 Jul 8 22:33 Eastern -> ../SystemV/EST5EDT
lrwxrwxrwx 1 root root 37 Jul 8 22:33 East-Indiana -> ../posix/America/Indiana/Indianapolis
lrwxrwxrwx 1 root root 19 Jul 8 22:33 Hawaii -> ../Pacific/Honolulu
lrwxrwxrwx 1 root root 24 Jul 8 22:33 Indiana-Starke -> ../posix/America/Knox_IN
lrwxrwxrwx 1 root root 24 Jul 8 22:33 Michigan -> ../posix/America/Detroit
lrwxrwxrwx 1 root root 18 Jul 8 22:33 Mountain -> ../SystemV/MST7MDT
lrwxrwxrwx 1 root root 18 Jul 8 22:33 Pacific -> ../SystemV/PST8PDT
lrwxrwxrwx 1 root root 18 Jul 8 22:33 Pacific-New -> ../SystemV/PST8PDT
lrwxrwxrwx 1 root root 20 Jul 8 22:33 Samoa -> ../Pacific/Pago_Pago
root@Ubuntu#
Et une telle déclaration est supposée fonctionner:
SET time_zone='US/Eastern';
Mais vous avez ce problème:
Code d'erreur: 1298. Fuseau horaire inconnu ou incorrect: 'EUS/Eastern'
Examinez le sous-dossier de votre répertoire d'informations de zone et voyez le nom de fichier ACTUAL pour le lien symbolique, dans le cas présent, il s'agit de EST5EDT. Puis essayez plutôt cette déclaration:
SET time_zone='EST5EDT';
Et cela fonctionne comme prévu! :) Gardez cette astuce à l'esprit; Je ne l'ai pas vu être documenté dans les manuels MySQL et la documentation officielle. Mais lire la documentation correspondante est une chose à ne pas manquer: documentation officielle de MySQL 5.5: timezone - et n'oubliez pas de charger les données de fuseau horaire sur votre serveur, comme cela (exécuté en tant qu'utilisateur root!):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
Astuce numéro un - cela doit être fait exactement sous l'utilisateur root MySQL. Il peut échouer ou produire des résultats inutilisables, même de la part d’un utilisateur ayant un accès complet à une base de données MySQL - j’ai moi-même constaté le problème.
Si vous utilisez PDO:
$offset="+10:00";
$db->exec("SET time_zone='".$offset."';");
Si vous utilisez MySQLi:
$db->MySQLi->query("SET time_zone='".$offset."';");
Plus d'informations sur le formatage de l'offset ici: https://www.sitepoint.com/synchronize-php-mysql-timezone-configuration/
Ancienne question avec une autre suggestion:
Si vous avez récemment modifié le fuseau horaire du système d'exploitation, par exemple via:
unlink /etc/localtime
ln -s /etc/usr/share/zoneinfo/US/Eastern /etc/localtime
... MySQL (ou MariaDB) ne le remarquera pas avant le redémarrage du service de base de données:
service mysqld restart
(ou)
service mariadb restart
Pour définir le fuseau horaire standard à MariaDB, vous devez accéder au fichier 50-server.cnf.
Sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Ensuite, vous pouvez entrer l’entrée suivante dans la section mysqld.
default-time-zone='+01:00'
Exemple:
#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#
# this is read by the standalone daemon and embedded servers
[server]
# this is only for the mysqld standalone daemon
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
### Default timezone ###
default-time-zone='+01:00'
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
La modification doit être effectuée via le fichier de configuration, sinon le serveur MariaDB réinitialisera les tables mysql après un redémarrage!
Si vous utilisez MySql Workbench, vous pouvez le définir en ouvrant la vue administrateur et en sélectionnant l'onglet Avancé. La section supérieure est "Localisation" et la première case à cocher doit être "default-time-zone". Cochez cette case, puis entrez le fuseau horaire de votre choix, redémarrez le serveur et vous devriez être prêt à partir.
D'abord pour comprendre quelle est la zone de temps que vous pouvez interroger
SHOW VARIABLES LIKE '%time_zone%';
Votre sortie devrait être quelque chose de similaire comme suit
**Variable_name** **Value**
system_time_zone CDT
time_zone SYSTEM
Ensuite, si vous voulez confirmer que vous êtes dans un fuseau horaire tel que CDT au lieu de quelque chose comme EST, vous pouvez vérifier l’heure à laquelle votre machine se trouve en disant:
SELECT NOW();
Si ce n'est pas le moment que vous voulez, vous devez le changer ... tout ce que vous avez à faire est de SET time_zone = timezone_name
. Assurez-vous qu'il s'agit du format Continent/City
.
Si vous êtes sur un serveur partagé parce que vous avez un service d'hébergement, veuillez vous référer à ces réponses concernant la modification du fichier php.ini ou du fichier .htaccess.
Sous Windows (IIS), pour pouvoir SET GLOBAL time_zone = 'Europe/Helsinki' (ou autre), les tables de description MySQL time_zone doivent d'abord être remplies.
J'ai téléchargé ces derniers à partir de ce lien https://dev.mysql.com/downloads/timezones.html
Après avoir exécuté la requête SQL téléchargée, j'ai pu définir le time_zone GLOBAL et résoudre le problème que j'avais où SELECT NOW (); retournait GMT plutôt que BST.