私の目的のためにそれを理解しました。私が学んだことを要約します(申し訳ありませんが、これらのメモは冗長です。これらは他の何よりも私の将来の紹介用です)。
私は私の以前のコメントの一つに言ったことに反して、DATETIMEおよびTIMESTAMPフィールドがない動作が異なります。TIMESTAMPフィールド(ドキュメントに示されている)は、「YYYY-MM-DD hh:mm:ss」形式で送信したものをすべて受け取り、現在のタイムゾーンからUTC時間に変換します。データを取得するたびに、その逆が透過的に行われます。DATETIMEフィールドはこの変換を行いません。あなたが送ったものは何でも受け取り、直接保存します。
DATETIMEとTIMESTAMPのどちらのフィールドタイプも、DSTを監視するタイムゾーンにデータを正確に格納できません。「2009-11-01 01:30:00」を保存する場合、フィールドには、必要な1:30 amのバージョン(-04:00または-05:00バージョン)を区別する方法がありません。
では、データをDST以外のタイムゾーン(UTCなど)に保存する必要があります。説明する理由により、TIMESTAMPフィールドはこのデータを正確に処理できません。システムがDSTタイムゾーンに設定されている場合、TIMESTAMPに入力したものは、取得したものと異なる場合があります。すでにUTCに変換したデータを送信しても、データはローカルタイムゾーンにあると見なされ、さらにUTCに変換されます。ローカルタイムゾーンがDSTを遵守している場合、このTIMESTAMP強制によるローカルからUTC、バックからローカルへのラウンドトリップは不可逆です( "2009-11-01 01:30:00"が2つの異なる時間にマップされるため)。
DATETIMEを使用すると、任意のタイムゾーンでデータを保存でき、送信したデータを確実に取り戻すことができます(TIMESTAMPフィールドが強制する損失の多い往復変換に強制されることはありません)。したがって、解決策はDATETIMEフィールドを使用して、フィールドに保存する前に、システムのタイムゾーンから、保存先のDST以外のゾーンに変換することです(UTCがおそらく最良のオプションだと思います)。これにより、変換ロジックをスクリプト言語に組み込んで、 "2009-11-01 01:30:00 -04:00"または "" 2009-11-01 01:30:に相当するUTCを明示的に保存できます。 00 -05:00」。
注意すべきもう1つの重要な点は、日付をDST TZに格納した場合、MySQLの日付/時刻演算関数はDSTの境界で正しく機能しないことです。したがって、UTCで保存する理由はなおさらです。
一言で言えば、私は今これを行います:
データベースからデータを取得する場合:
正確なUnixタイムスタンプを取得するために、データベースのデータをMySQLの外部のUTCとして明示的に解釈します。これには、PHPのstrtotime()関数またはそのDateTimeクラスを使用します。MySQLのCONVERT_TZ()またはUNIX_TIMESTAMP()関数を使用してMySQL内で確実に実行することはできません。CONVERT_TZは、あいまいな問題のある 'YYYY-MM-DD hh:mm:ss'値のみを出力し、UNIX_TIMESTAMP()は入力はシステムのタイムゾーンであり、データが実際に格納されたタイムゾーン(UTC)ではありません。
データをデータベースに保存する場合:
MySQL以外で希望する正確なUTC時間に日付を変換します。例:PHPのDateTimeクラスでは、「2009-11-01 1:30:00 EST」と「2009-11-01 1:30:00 EDT」を区別して指定し、それをUTCに変換して正しいUTC時間を保存できます。 DATETIMEフィールドに。
ふew。皆様のご意見、ご協力に感謝いたします。うまくいけば、これにより他の誰かが将来の頭痛の種を救うことができます。
ところで、私はこれをMySQL 5.0.22および5.0.27で見ています