どうすれば入手することができますか
FROM_UNIXTIME
mysqlのUTC/GMTとして?日付は接続のタイムゾーンで返されます。
接続のタイムゾーンを変更したくない。
事前にタイムゾーンを設定することをお勧めします。
_SET time_zone='UTC';
select FROM_UNIXTIME(1277942400);
_
その理由は、ローカルタイムゾーンを含む変換では損失が生じる可能性があるためです。この例は docs here にあります(UNIX_TIMESTAMP()
セクションの下にある「注:」で始まる4番目の段落を参照してください)。
私の解決策は
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
私はこれが答えられたことを知っていますが、それでも貢献したいと思います:
サーバーが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;
私のように怠惰で、グローバルセッションのタイムゾーン変数を変更したくない場合(別のサーバーに移動し、そこで変更するのを忘れてホップした場合、問題が発生します)、セッション変数(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())でラップするだけで、日が保存されます:)。