检查时间(带时区)是否在给定的时间范围内

时间:2015-04-06 16:04:09

标签: php mysql timezone

我需要每天向所有必须在给定时间范围内检查血压的用户发送提醒短信。 我的日程表中的记录是:

user_id |name   |checkup_time |timezone
1       | user1 | 01:30:00    | PST
2       | user2 | 03:00:00    | CST

目前,我能够获得检查时间介于current_time和(当前时间+30分钟)之间的用户列表。

我使用了以下mysql查询来实现此目的:

$checkup_time_min = date('H:i:s');
$checkup_time_max = date("H:i:s", strtotime($currTime ."+30 minutes"));

SELECT ...  WHERE checkup_time BETWEEN '".$checkup_time_min."' AND '".$checkup_time_max."'

但是,我希望在这种情况下考虑time_zone。

我真的很感激任何帮助或提示。

提前致谢

2 个答案:

答案 0 :(得分:1)

您可能希望将时间存储在数据库中,这样可以使这样的查询更加合理且易于理解。当你从数据库中抽出时间时,你也可以拉出timeozne并在那时进行必要的转换。

实际上,您可以查询

之间的所有值

$checkup_time_min +- (time conversion for given timezone)

$checkup_time_max -+ (time conversion for given timezone)

但您需要为每个时区运行不同的查询。或者你可以做一堆if语句来检查时区,但这不是更清晰。

答案 1 :(得分:0)

感谢您发出指示。我发现CONVERT_TZ就是我所需要的。

考虑到马特约翰逊的建议,我已将列时区的数据更改为:(从CST到-05:00)

user_id |name   |checkup_time |timezone
1       | user1 | 01:30:00    | -08:00
2       | user2 | 03:00:00    | -05:00

代码更改为

$checkup_time_min = date('Y-m-d H:i:s');
$checkup_time_max = date("Y-m-d H:i:s", strtotime($currTime ."+30 minutes"));

SELECT ...  WHERE checkup_time BETWEEN CONVERT_TZ ('".$checkup_time_min ."','-05:00',timezone) AND CONVERT_TZ ('".$checkup_time_max ."','-05:00',timezone)

注意:服务器的时区是CST,因此转换到' -05:00'