使用时间戳和时区

时间:2012-02-27 13:53:35

标签: php mysql time

从我的Android智能手机应用程序(由我自己制作)中,我向丹佛的服务器发送请求以保存我的位置和时间。它保存的TIMESTAMP是丹佛当前时间(与当地时间相差9小时)。从我上一次请求的16个小时后,我在我的PHP脚本中写道

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

好像我想在24小时后告诉我......

这是错误的!

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

!= 24小时!!!

1 个答案:

答案 0 :(得分:1)

您需要更改MySQL's time zone而不是PHP,或更改您的查询以便PHP提供时间戳,如下所示:

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

<小时/> 根据评论

编辑

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

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

您的搜索结果可能仍然不太合适。他们可能目前只是看起来正确,但可能会在几个小时后关闭。但是,如果您要根据CURRENT_TIMESTAMP插入和更新,然后根据UTC_TIMESTAMP进行选择,那么您的搜索结果将不正确。

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

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