我在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
但我想知道是否有人可以提供更好的路线图/架构来设置我的脚本。
非常感谢任何指针,还要考虑如何考虑本地和用户的夏令时。
感谢。
答案 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的正确数据库时间,反之亦然。