Dans MySQL, calculer un décalage pour un fuseau horaire
Question
Existe-t-il un moyen dans MySQL de calculer le décalage pour n’importe quel fuseau horaire?
Par exemple, pour obtenir l'heure locale dans le fuseau horaire Asia / calcutta ??code>. Ce que je veux faire, c'est calculer l'offset pour ce fuseau horaire et l'ajouter à GMT pour obtenir l'heure locale.
La solution
Si vous souhaitez calculer le décalage d'un fuseau horaire tel que America / Vancouver à partir de l'UTC, vous pouvez le faire comme suit:
SELECT (unix_timestamp() - unix_timestamp(convert_tz(now(), 'Etc/UTC', 'America/Vancouver'))) / 3600 as offset;
Pour que cela fonctionne, vous devez d'abord charger les informations de fuseau horaire dans mysql, comme indiqué ci-dessous: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
Autres conseils
SELECT TIMESTAMPDIFF (HOUR, UTC_TIMESTAMP (), NOW ());
Si le fuseau horaire du serveur est PST, cela renverra -8
.
SELECT TIMESTAMPDIFF (SECOND, NOW (), UTC_TIMESTAMP ());
Ajoutez le résultat de ce qui précède à n’importe quel horodatage Unix si vous souhaitez le comparer à MySQL DateTimes.
Le décalage dépendra du temps qui vous intéresse. Par exemple, je suis actuellement décalé d'une heure par rapport à l'heure UTC, mais pendant l'hiver, mon décalage serait égal à zéro.
À en juger par la page de documentation sur le fuseau horaire de MySQL. , vous voulez utiliser le convert_tz
. Si vous tentez de convertir l'heure UTC en heure locale, transmettez-le, etc., puis appuyez sur GMT + 0. comme le " from " fuseau horaire et "Asie / Calcutta" comme le "à".
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;
Donner
+--------+
| offset |
+--------+
| 05:30 |
+--------+
J'ai mélangé les réponses de @ColinM et de Kenneth Spencer parce que je voulais le décalage d'un fuseau horaire arbitraire en heures:
TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "UTC", "America/Denver"))
-
SELECT ROUND(TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", "Asia/Kolkata"))/60,1)
Comme Kenneth l'a souligné, vous devez charger les informations de fuseau horaire: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
Mais vous pouvez ensuite faire des choses amusantes comme trouver le décalage pour plusieurs fuseaux horaires à la fois:
SELECT Name,
TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", Name)) as Offset
FROM mysql.time_zone_name
WHERE (Name IN ('America/Vancouver', 'Etc/UTC', 'America/Denver'))
Donner:
+-------------------+--------+
| Name | Offset |
+-------------------+--------+
| America/Denver | -6 |
| America/Vancouver | -7 |
| Etc/UTC | 0 |
+-------------------+--------+
DATEDIFF(NOW(), UTC_TIMESTAMP())
SET time_zone = '-07:00';
Vous pouvez simplement passer un décalage
http://dev.mysql.com /doc/refman/5.1/fr/time-zone-support.html
Je me demande si la réponse de @ ColinM ci-dessus est sûre. Est-ce qu'il lit l'horloge une ou deux fois? Est-il possible que UTC_TIMESTAMP () et NOW () soient séparés d'une seconde? Je ne sais pas, mais cela éviterait cela.
SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);