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 . Ce que je veux faire, c'est calculer l'offset pour ce fuseau horaire et l'ajouter à GMT pour obtenir l'heure locale.

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top