使用时间戳和时区


working with timestamps and time zones

通过我的android智能手机应用程序(我自己制作),我向丹佛的服务器发送了一个请求,以保存我的位置和时间。它保存的TIMESTAMP是丹佛的当前时间(与当地时间相差9小时)。现在,距离我在php脚本中写的最后一个请求已经过去了16个小时

$query = "SELECT * FROM `tblLoc` WHERE datetime > (CURRENT_TIMESTAMP - 86400)";

就好像我想展示过去的24小时。。。。

这是个错误!

$query = "SELECT * FROM `tblLoc` WHERE datetime > CURRENT_TIMESTAMP() - INTERVAL 24 HOUR";

在SQL 86400中!=24小时!!!

您需要更改MySQL的时区而不是PHP的时区,或者更改查询以使PHP提供时间戳,如下所示:

$query = "SELECT * FROM tblLoc WHERE dateTime > (". time() ." - 86400)";


编辑基于评论

UTC_TIMESTAMP()可能是一个不错的方法,但请确保您也基于相同的时间戳插入/更新,而不是基于CURRENT_TIMESTAMP()

UTC时间戳基于GMT(格林尼治标准时间),位于GMT+0。达拉斯时间为GMT-6,亚洲/耶路撒冷时间为GMT+2。因此,UTC_TIMESTAMP()始终表示GMT时区中的当前时间,而不管您当前的时区设置是什么。CURRENT_TIMESTAMP()表示当前时区的当前时间。

但是您的结果可能仍然不太正确。他们可能只是暂时看起来不错,但可能会休息几个小时。但是,如果您是基于CURRENT_TIMESTAMP插入和更新,然后基于UTC_TIMESTAMP选择,则结果将不正确。

我建议以下三种解决方案之一:

  1. 将服务器的时区切换到亚洲/耶路撒冷(确保重新启动MySQL以应用更改)
  2. 使用"Set time_zone=timezone;"在每个脚本的开头设置时区
  3. 制作一个具有正确时区的TZ环境变量,以便MySQL在启动时将该时区设置为默认时区(同样,请确保重新启动MySQL)