web-dev-qa-db-ja.com

Mysql FROM_UNIXTIME as UTC

どうすれば入手することができますか

FROM_UNIXTIME

mysqlのUTC/GMTとして?日付は接続のタ​​イムゾーンで返されます。

接続のタイムゾーンを変更したくない。

29
wutzebaer

事前にタイムゾーンを設定することをお勧めします。

_SET time_zone='UTC';
select FROM_UNIXTIME(1277942400);
_

その理由は、ローカルタイムゾーンを含む変換では損失が生じる可能性があるためです。この例は docs here にあります(UNIX_TIMESTAMP()セクションの下にある「注:」で始まる4番目の段落を参照してください)。

20

私の解決策は

SELECT CONVERT_TZ(FROM_UNIXTIME(1277942400), @@session.time_zone,'UTC')

cONVERT_TZがnullを返す場合、mysqlのタイムゾーンテーブルが入力されていることを確認します。

zypper install mysql-community-server-tools
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
17
wutzebaer

私はこれが答えられたことを知っていますが、それでも貢献したいと思います:

サーバーがNOW()FROM_UNIXTIME()などの関数を使用してUTCタイムゾーン時間を生成したくない場合は、@ Matt Johnsonが言ったようにtime_zoneを設定する必要があります。

彼が言及しなかったことがあります:SET time_zone = timezone;は現在の接続のみのタイムゾーンを設定します。これらの関数でデフォルトで日付をUTCで返したり変換したりする場合は、SET GLOBAL time_zone = '+00:00'を使用します。これにより、一部のUTCベースの日付を保存するたびにタイムゾーンを設定する必要がなくなりました。

現在のタイムゾーン設定を確認してください:SELECT @@global.time_zone, @@session.time_zone;

MySQL :: MySQL 5.5リファレンスマニュアル:: 10.6 MySQLサーバーのタイムゾーンサポート

2

私のように怠惰で、グローバルセッションのタイムゾーン変数を変更したくない場合(別のサーバーに移動し、そこで変更するのを忘れてホップした場合、問題が発生します)、セッション変数(dbとhopに自動再接続しているいくつかのモジュールを使用して、接続時に発行された変数はなくなりました)タイムゾーンのものをロードしたくない場合は、これが役立つかもしれません:).

select 
  now() as timezoned,
  date_add(
    FROM_UNIXTIME(0), interval 
      unix_timestamp()+TIMESTAMPDIFF(SECOND,NOW(),UTC_TIMESTAMP()) SECOND
  ) as utc

負のタイムスタンプでも機能します。特定の列を変換する必要がある場合は、unix_timestamp()をタイムスタンプを含む列に置き換えます。

おまけとして、カラムがunix_timestamp(たとえば、 "utc")にあるときにdatetimeとnowの間の差を見つける必要がある場合は、TIMESTAMPdiff(SECOND、..、NOW())でラップするだけで、日が保存されます:)。

0
Issay