我已经弄清楚了它,以达到我的目的。我将总结我所学到的东西(抱歉,这些笔记很详细;它们对我未来的推荐和其他任何东西一样多)。
与我之前的评论中所说的相反,DATETIME 和 TIMESTAMP 字段的行为确实不同。TIMESTAMP 字段(如文档所示)采用您以“YYYY-MM-DD hh:mm:ss”格式发送的任何内容,并将其从当前时区转换为 UTC 时间。每当您检索数据时,反之则以透明方式发生。日期时间字段不进行此转换。他们拿走你寄给他们的任何东西,直接存储。
DATETIME 和 TIMESTAMP 字段类型都不能准确地将数据存储在遵守 DST 的时区中。如果存储“2009-11-01 01:30:00”,则无法区分所需的 1:30am 版本 -- -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:00 -05:00“的UTC等效项。
另一个需要注意的重要事情是,如果您将日期存储在DST TZ中,MySQL的日期/时间数学函数将无法在DST边界周围正常工作。因此,更有理由在UTC中保存。
简而言之,我现在这样做:
从数据库中检索数据时:
在MySQL之外将数据库中的数据显式解释为UTC,以获得准确的Unix时间戳。为此,我使用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 字段中。
唷。非常感谢大家的投入和帮助。希望这能为其他人节省一些麻烦。
顺便说一句,我在MySQL 5.0.22和5.0.27上看到了这个