質問

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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top