Часовые пояса и работа с электронной почтой: как это сделать правильно? - PullRequest
1 голос
/ 13 мая 2011

Я искал в SO и в других местах, но не нашел прямого ответа на это, поэтому на данный момент я считаю, что это заслуживает упоминания здесь.Пожалуйста, сообщите, если вы думаете иначе.

Я использую Codeigniter 2.0.2, PHP 5.2.14, MySQL 5.0.77.

Я настраиваю задание cron, которое будет запускаться каждые 15 минут,В этом задании cron будет запущен модельный скрипт, который проверяет БД на наличие событий, требующих оповещения по электронной почте.События, возвращающие значение true, предназначены для отправки электронных писем.

Моя проблема связана с часовыми поясами моих пользователей.Мой сервер EST (UTC-5).Если у меня есть пользователь, зарегистрированный как UTC + 5, мой сценарий отправит уведомление по электронной почте на 10 часов раньше, чем ожидалось.

Чтобы исправить это, я хотел спросить, приемлем ли этот рабочий процесс:

  • пользователь - UTC + 5

  • сервер - UTC -5

  • запланированное событие - 10 вечера (21:00)по местному времени пользователя

  • вычтите разницу часовых поясов (21:00 - 10 = 11:00)

  • отправьте электронное письмо в 11:00

Некоторые ответы, которые я нашел здесь:

Как запланировать рассылку писем

Создание расписания, которое работает на протяженииразные часовые пояса и летнее время

, но мне интересно, кто-нибудь может предоставить лучшую дорожную карту / схему для настройки моего сценария.

Любые указатели очень ценятся, также как учесть дневной светэкономия времени как локального, так и от пользователя.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Как уже было предложено, я нормализую все даты, записываемые в вашу базу данных, в UTC, а затем вы можете легко прочитать их оттуда, преобразовав обратно, когда прочитаете их, если это необходимо.

Функция CONVERT_TZ() позволит вам легко выполнять эти преобразования. например.

CONVERT_TZ('2011-05-11 15:23:00','GMT','Europe/London');
1 голос
/ 13 мая 2011

Я использую эту функцию для преобразования часовых поясов:

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 с и наоборот.

...