PHP使用预选时区计划了电子邮件警报



我一直在搜索很多,我似乎找不到解决方案。

我有一个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差)。

最新更新