时区和电子邮件cron工作:怎么做对了?

时间:2011-05-12 21:38:33

标签: php timezone message-queue

我在SO和其他地方搜索过,但没有找到直接答案,所以在这一点上我认为它值得在这里输入。如果您不这么认真,请告知。

我正在使用Codeigniter 2.0.2,PHP 5.2.14,MySQL 5.0.77。

我正在设置一个每15分钟运行一次的cron作业。此cron作业将运行模型脚本,该脚本检查DB以查找需要电子邮件警报的事件。返回true的事件会被发送给发送电子邮件。

我的问题在于我的用户的时区。我的服务器是EST(UTC -5)。如果我有一个注册为UTC +5的用户,我的脚本将比预期提前10小时发送电子邮件提醒。

为了解决这个问题,我想问一下这个工作流程是否可以接受:

  • 用户为UTC +5

  • 服务器是UTC -5

  • 预定活动是用户当地时间晚上10点(21:00)

  • 减去时区差异(21:00 - 10 = 11AM)

  • 在上午11点发送电子邮件

我找到的一些答案就在这里

How to schedule emails to send out

Generating a schedule that works over different timezones and DSTs

但我想知道是否有人可以提供更好的路线图/架构来设置我的脚本。

非常感谢任何指针,还要考虑如何考虑本地和用户的夏令时。

感谢。

2 个答案:

答案 0 :(得分:2)

正如所建议的那样,我会将写入您数据库的所有日期标准化为UTC,然后您可以轻松地将它们从那里读出来,并在必要时进行转换。

CONVERT_TZ()功能可让您轻松执行这些转换。例如

CONVERT_TZ('2011-05-11 15:23:00','GMT','Europe/London');

答案 1 :(得分:1)

我使用此功能转换时区:

function switch_timezone($format, $time = null, 
    $to = "America/Los_Angeles", $from = "America/Los_Angeles")
{
    if ($time == null) $time = time();

    $from_tz = new DateTimeZone($from);
    $to_tz = new DateTimeZone($to);

    if (is_int($time)) $time = '@' . $time;

    $dt = date_create($time, $from_tz);

    if ($dt)
    {
        $dt->setTimezone($to_tz);
        return $dt->format($format);
    }

    return date($format, $time);
}

似乎您应该能够使用它将当前时间转换为SELECT s的正确数据库时间,反之亦然。