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

check if time(with timezone) lies in given time range

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

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。

非常感谢任何帮助或提示。

提前致谢

您可能希望在数据库中将时间存储为 UTC,这将使此类查询更加合乎逻辑且易于理解。当您从数据库中提取时间时,您还可以提取 timeozne 并在那时进行任何必要的转换。

实际上,您可以查询

之间的所有值

$checkup_time_min +- (time conversion for given timezone)

$checkup_time_max -+ (time conversion for given timezone)

但您需要运行针对每个时区进行不同的查询。或者,您可以执行一堆 if 语句来检查时区,但这并不干净。

感谢指点。我发现 CONVERT_TZ 正是我所需要的。

考虑到 Matt Johnson 的建议,我将时区列中的数据更改如下:(从 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”