タイムゾーンに基づいてmysqlに日付を保存する

画像

mysqlに保存されている日付との混同を避ける方法に関する記事。

これらの混乱は、次の2つの理由で発生します。

1.私たちの惑星の異なる領域は、異なる時間シフトを持っています。

2.一部の国では、夏時間に切り替えてから戻ります( 夏時間に切り替える国のマップ )。



多くの場合、これらの問題はさまざまな方法で解決されます。 誰かがSQLクエリで日付シフトを行い、誰かがphpでシフトします。 誰かが日付をTIMESTAMPに、誰かをDATETIMEに保存します。 多くの情報源を検索しましたが、ロシア語のどこでもこの問題の適切な解決策を見つけられませんでした。 ネイティブのmysqlドキュメントで、TIMESTAMPから現地時間への正しい自動変換を実現する方法に関する情報を見つけましたが、これには落とし穴もあります。



PHPでタイムゾーンの設定が簡単な場合、特にmysqlサーバーへのアクセスが制限されていて、一部のテーブルがそこにまだインストールされていない場合、mysqlで問題が発生します。



TIMESTAMPとDATETIMEの日付ストレージ形式の違いは、ご存知だと思います。

TIMESTAMPは、ローカル設定に依存しない絶対時間値です。 どの国でも、どのコンピューターでも、まったく同じものです。 したがって、ほとんどの場合、日付をTIMESTAMPに保存することをお勧めします。



リクエストした場合

SELECT `timestamp_field` FROM table





「yyyy-mm-dd hh:mm:ss」の形式で日付を受け取ります。

すべてがシンプルに思えます。 そして、この単純さは魅力的すぎるため、日付が割り当てられているユーザーのタイムゾーンを指定する必要があるため、問題が発生する可能性があります。

そして解決策があります:リクエストによってゾーンを設定できます



SET time_zone='+03:00'







ここで、「+ 03:00」は、ロンドン時間ゼロからの現在の日付オフセットです。

しかし、このクエリの後、mysqlは夏時間を誤って処理し始めます。

time_zoneがSYSTEM(デフォルト)に設定されている場合、夏時間は正しく処理されます。

たとえば、夏であり、夏時間が有効です。

データベースに保存されているTIMESTAMPを現地時間に変換する必要があります。 その値は946681261です(これはキエフ時間では '2000-01-01 01:01:01'です)

リクエストを行います:



SET time_zone = 'SYSTEM';

SELECT NOW(), FROM_UNIXTIME(946681261);








結果が得られます。

今() FROM_UNIXTIME(946681261)
2009-09-14 16:00:40 2000-01-01 01:01:01




タイムゾーンを変更します

SET time_zone = '+03:00';

SELECT NOW(), FROM_UNIXTIME(946681261);








今() FROM_UNIXTIME(946681261)
2009-09-14 16:00:40 2000-01-01 02:01:01


ご覧のとおり、予想される「2000-01-01 01:01:01」の代わりに、さらに1時間の時間がありました。 一方、現在の時刻は正しく表示されます。

必要に応じてmysqlを構成し(データベースへのフルアクセスがある場合)、次の形式でタイムゾーンを設定できます。



SET time_zone = 'America/Toronto';







その後、すべての問題が消えるように見えるかもしれません。 しかし、驚きもあるかもしれません。

たとえば、2007年に、米国、メキシコ、およびカナダでは、夏時間規則にいくつかの変更が加えられました。 また、タイムゾーンのデータはmysqlに手動で入力されるため、データの関連性を監視する必要があります。 さらに悪いことに、たとえば、PHP言語を使用する場合、mysqlのタイムゾーンのデータがPHPのデータと一致することを確認する必要があります。これははるかに複雑です。



それが最良のソリューションです。PHPを使用している場合、次のように表示されます。

1. TIMESTAMPでmysqlに日付を保存する

2.関数でPHPのユーザーのタイムゾーンを常に設定する

date_default_timezone_set()





3.データベースからTIMESTAMP値を取得し、PHP関数で目的の形式に変換します

date($format, $timestamp);







少なくとも2038年までは、日付の混乱がないことを確認できます。



更新: MySQLブログに移動



All Articles