我一直在搜索很多,我似乎找不到解决方案。
我有一个PHP网页,可以在特定时间安排电子邮件警报。我选择要发送警报的日期和时间。这以UNIX格式存储在MySQL表中。我有一项工作每15分钟执行一次,如果日期 时间为过去,则发送电子邮件 - 这一切都很好,除非我需要为美国同事扩展它。我位于爱尔兰,因此我需要管理整个美国各地的不同时区。我正计划添加用户注册后必须选择的时区域的精选列表...至少这是一个开始。管理时区是可以的,因为我认为我要做的就是减去与服务器时间不同的时间,然后以Unix格式节省日期时间。DST是一个不同的问题 - 有人对如何克服这一点有任何想法吗?
我已经阅读了使用UTC作为基本时间,但是即使是这种情况,我仍然存在相同的问题?
感谢MIL!
您的时间已经处于UNIX TIMESTAMP格式,因此您需要的只是计算用户的时间差(偏移)。例如,爱尔兰在UTC/UTC+1
时区。因此,您需要的只是进行数学,例如 JAMES_T 在他的评论中提到的数学。如果您需要来自爱尔兰的用户在9:00pm UTC+1
中获得电子邮件,则必须在8:00pm UTC
中发送。那是什么主意?
允许用户选择时区,这意味着他们从UTC选择偏移。将其保存在数据库中(您的用户表或其他表格,都没关系)。
以秒为单位转换偏移:
$delta_time = -1 * $offset * 3600
然后计算触发时间:
$trigger_time = time() + $delta_time;
现在,您有时间根据用户的时区设置,您的电子邮件发件人可以在正确的时刻发射。
例如:
$offset = 1; // summer in Ireland
$server_time = time(); // at the moment 1350509127
$delta_time = -1 * $offset * 3600; // -3600
$trigger_time = $server_time + $delta_time; // 1350505527
您需要的只是将$trigger_time
与数据库中的UNIX TIMESTAMP进行比较,然后决定发送电子邮件(或不)。
ofc,使用PHP时区而不是纯/-偏移并在某些位置适用DST时保持更新是不错的。
进行一些测试,这并不难。
这只是一个一般的想法,而不是完整的工作解决方案。
更新:
要在任何两个时区之间以秒为单位计算时间差异:
功能delta_offset()
function delta_offset($server_timezone, $user_timezone) {
$dt = new DateTime('now', new DateTimeZone($server_timezone));
$offset_server = $dt->getOffset();
$dt->setTimezone(new DateTimeZone($user_timezone));
$offset_user = $dt->getOffset();
return $offset_user - $offset_server;
}
在几秒钟内获得偏移:
$server_tz = "Europe/London";
$user_tz = "America/New_York";
$offset = delta_offset($server_tz, $user_tz); // offset in sec.
创建一些输出:
$dt = new DateTime('now', new DateTimeZone('UTC'));
echo "<pre>UTC date/time: " . $dt->format('l, F jS, <b>H:i:s</b>') . "n";
$dt = new DateTime('now', new DateTimeZone($server_tz));
echo "London date/time: " . $dt->format('l, F jS, <b>H:i:s</b>') . "n";
$dt = new DateTime('now', new DateTimeZone($user_tz));
echo "New York date/time: " . $dt->format('l, F jS, <b>H:i:s</b>') . "nn";
echo "Time difference between London (UK) and New York (USA) is: <b>$offset_h</b> ($offset s)</pre>";
在浏览器中输出(在撰写本文时):
UTC date/time: Wednesday, October 17th, 22:32:27
London date/time: Wednesday, October 17th, 23:32:27
New York date/time: Wednesday, October 17th, 18:32:27
Time difference between London (UK) and New York (USA) is: -5:00 (-18000 s)
在这种情况下,偏移量为-5小时(-18000秒),但是如果DST规则以函数为单位的任何时区更改,则自动更改。
delta offset 提供信息,您必须在不同时区中向用户发送电子邮件,而您现在所需要的只是使用您的电子邮件sender的调度程序进行简单的+/- delta-offset
。p>希望这可以帮助您解决问题。
更新#2-示例(理论)
想象这种情况。
您当前的服务器时间为X
及其7:00pm
目前在爱尔兰。我住在塞尔维亚,我们有相同的DST规则,但是我之后一个小时(UTC 1/UTC 2)。您和我的时间之间的区别是+3600 seconds
(1小时)。
现在,您必须在10:00pm
中向我发送电子邮件(9:00pm in Ireland
)。
- 当前时间是
X
。 - delta-offset是
-1 * +3600 = -3600
(delta-offset乘以-1)。 - 在10:00 pm在您的位置发送时间是
X + 10800
(3小时后)。 - 晚上10点在我的位置发送时间是
X + 10800 + delta-offset = X + 7200
(2小时后)。
公式检查实际时间是否等于还是大于触发时间(发送时间)为:
current_timestamp >= trigger_timestamp + delta_offset
delta_offset()
功能的delta offset必须乘以 -1
才能用于公式。
现在,您可以在需要时发送电子邮件,并确保使用用户的本地时间(OFC,如果用户时区设置正确)将其发送。
注意:与此示例的区别(塞尔维亚 - 爱尔兰= 1小时)在DST更改期间有所不同,这意味着每年我们处于同一时区(0 delta-offset
),而一个小时我们有+2 hours delta-offset
。这是可能的,因为DST更改是在塞尔维亚提前1小时应用的,因此当我们的时间更改 1时,您必须等60分钟才能将同一更改适用于爱尔兰时间 *,然后我们 2),当我们带回时,时钟到正常时间(0差)。