2009-04-30 9 views
13

Gibt es eine Möglichkeit in Mysql den Offset für jede Zeitzone zu berechnen. Um beispielsweise die lokale Zeit in der Zeitzone 'Asia/calcutta' zu erhalten, berechne ich den Offset für diese Zeitzone und füge diesen Offset zu GMT hinzu, um die lokale Zeit zu erhalten.In MySQL caculating Offset für eine Zeitzone

Antwort

11

Wenn Sie den Offset einer Zeitzone wie Amerika/Vancouver von UTC berechnen wollen Sie es tun können, wie folgt:

SELECT (unix_timestamp() - unix_timestamp(convert_tz(now(), 'Etc/UTC', 'America/Vancouver')))/3600 as offset; 

Damit dies funktioniert, müssen Sie zuerst die Zeitzoneninformationen in mysql laden, wie hier beschrieben: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html

-1
DATEDIFF(NOW(), UTC_TIMESTAMP()) 
+1

DATEDIFF Giving gibt den Unterschied in * Tage * nicht Stunden oder Minuten .. – ColinM

5

Der Offset wird von der Zeit ab, die Sie interessiert sind - zum Beispiel, würde ich zur Zeit habe eine von einer Stunde von UTC versetzt, aber im Winter würde mein Offset gleich Null sein.

Gemessen an der docs page on MySQL time zone support, möchten Sie die convert_tz Funktion verwenden. Wenn Sie versuchen, UTC in Ortszeit umzurechnen, geben Sie "Etc/GMT + 0" als "Von" -Zeitzone und "Asien/Kalkutta" als "Bis" ein.

-1
SET time_zone = '-07:00'; 

Sie können nur passieren in einem Offset-

http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html

+0

Das funktioniert nicht so gut wie man denkt .... –

+0

Niemals Offset verwenden, um eine Zeitzone einzustellen! Verwenden Sie immer den Namen "Europa/Prag". Andernfalls werden Sie sehr überrascht sein, wenn DST auftritt. –

7

SELECT TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), NOW());

Wenn die Zeitzone des Servers PST ist dies -8 zurück.

SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP());

das Ergebnis der oben auf jedem Unix-Zeitstempel hinzufügen, wenn Sie es MySQL Datetime vergleichen möchten.

1

I gemischt @ColinM und @Kenneth Spencers Antworten auf, weil ich den Offset einer beliebigen Zeitzone in Stunden wanted:

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) 

Wie Kenneth darauf hingewiesen Sie brauchen Laden Sie die Zeitzone info: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html

Aber dann können Sie Spaß Dinge wie finden Sie den Offset für mehrere Zeitzonen auf einmal:

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')) 

Giving:

+-------------------+--------+ 
| Name    | Offset | 
+-------------------+--------+ 
| America/Denver |  -6 | 
| America/Vancouver |  -7 | 
| Etc/UTC   |  0 | 
+-------------------+--------+ 
0

Ich frage mich, ob @ ColinM Antwort oben sicher ist. Liest es die Uhr ein- oder zweimal? Gibt es eine Möglichkeit, dass UTC_TIMESTAMP() und NOW() eine Sekunde auseinander liegen können? Ich weiß es nicht, aber das würde das vermeiden.

SET @now = now(); 
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00'); 
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now); 
+0

das ist halb Frage halbe Antwort – Drew

1
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset; 

+--------+ 
| offset | 
+--------+ 
| 05:30 | 
+--------+ 
+0

Normalerweise ist es eine gute Idee, den Code in Ihrer Antwort zu erklären. Erzählen Sie, wie es funktioniert oder was genau Sie tun. Dies hilft neueren Entwicklern, genau zu verstehen, was vor sich geht. –