MySQLでタイムゾーンのオフセットを計算する
質問
MySQLに任意のタイムゾーンのオフセットを計算する方法はありますか?
たとえば、タイムゾーン Asia / calcutta
の現地時間を取得するには。私がやりたいのは、このタイムゾーンのオフセットを計算し、そのオフセットをGMTに追加して現地時間を取得することです。
解決
UTCからAmerica / Vancouverなどのタイムゾーンのオフセットを計算する場合は、次のように実行できます。
SELECT (unix_timestamp() - unix_timestamp(convert_tz(now(), 'Etc/UTC', 'America/Vancouver'))) / 3600 as offset;
これを機能させるには、まず、次のようにタイムゾーン情報をmysqlにロードする必要があります。 http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
他のヒント
SELECT TIMESTAMPDIFF(HOUR、UTC_TIMESTAMP()、NOW());
サーバーのタイムゾーンがPSTの場合、 -8
が返されます。
SELECT TIMESTAMPDIFF(SECOND、NOW()、UTC_TIMESTAMP());
MySQL DateTimesと比較する場合は、上記の結果をUNIXタイムスタンプに追加します。
オフセットは、関心のある時間に依存します-たとえば、現在UTCから1時間のオフセットがありますが、冬の間はオフセットはゼロになります。
MySQLタイムゾーンサポートのドキュメントページによる判断、 convert_tz
関数。 UTCを現地時間に変換する場合は、「Etc / GMT + 0」を渡します; 「から」としてタイムゾーン、および「アジア/カルカッタ」 " to"として。
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;
付与
+--------+
| offset |
+--------+
| 05:30 |
+--------+
時間単位の任意のタイムゾーンのオフセットが必要なため、@ ColinMと@Kenneth Spencerの回答を混同しました。
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)
ケネスが指摘したように、タイムゾーン情報を読み込む必要があります: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
ただし、複数のタイムゾーンのオフセットを一度に見つけるなどの楽しいことができます:
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'))
付与:
+-------------------+--------+
| Name | Offset |
+-------------------+--------+
| America/Denver | -6 |
| America/Vancouver | -7 |
| Etc/UTC | 0 |
+-------------------+--------+
DATEDIFF(NOW(), UTC_TIMESTAMP())
SET time_zone = '-07:00';
オフセットを渡すことができます
http://dev.mysql.com /doc/refman/5.1/en/time-zone-support.html
@ColinMの上記の答えは安全かと思います。クロックを1回または2回読み取りますか? UTC_TIMESTAMP()とNOW()が1秒離れている可能性はありますか?わかりませんが、これで回避できます。
SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);