Как отправить письмо по местному времени пользователя на .NET / Sql Server? - PullRequest
3 голосов
/ 22 августа 2008

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

Скажем, у меня 2 пользователя в разных часовых поясах. Джон в Нью-Йорке, а Фред в Лос-Анджелесе. Сервер находится в Чикаго. Если я хочу отправить электронное письмо в 18:00 по местному времени каждому пользователю, мне нужно будет отправить письмо Джону в 19:00 по времени сервера и Фреду в 16:00 по времени сервера.

Какой хороший подход к этому в .NET / Sql Server? Я нашел xml-файл со всей информацией о часовом поясе, поэтому я думаю написать сценарий для его импорта в базу данных, а затем запросить его.

Редактировать: Я использовал «t4znet.dll» и делал все сравнения на стороне .NET.

Ответы [ 3 ]

0 голосов
/ 22 августа 2008

У вас есть два варианта:

  • Сохранить настроенное время действия почты в базе данных для каждого пользователя. Затем просто сравните время сервера с сохраненным временем. Чтобы избежать путаницы и проблем с переносимостью, я должен хранить все время в UTC. Итак, отправляйте почту, когда SERVER_UTC_TIME () == StoreUtcTime.
  • Сохраните местное время для каждого почтового действия в базе данных, а затем конвертируйте на лету. Отправлять почту, когда SERVER_UTC_TIME () == TO_UTC_TIME (сохранено локальное время, пользовательское время).

Вы должны решить, что наиболее целесообразно для вашего приложения. Например, если время почтовой рассылки всегда одинаково для всех пользователей, имеет смысл перейти к варианту (2). Если время событий может изменяться между пользователями и даже для каждого пользователя, это может упростить разработку и отладку, если вы выберете параметр (1). В любом случае вам нужно знать часовой пояс пользователя.

* Эти вызовы функций, очевидно, псевдо, так как я не знаю их вызовов в T-SQL, но они должны существовать.

0 голосов
/ 26 августа 2008

Вы можете дополнить свое решение этой превосходной статьей « Мировое время и класс TimeZoneInformation », я сделал веб-сервис, который отправил файл с информацией, включающей местное время и время получателя, что я и сделал для измените этот класс, чтобы я мог справиться с этой проблемой, и он работал идеально, именно так, как мне было нужно.

Я думаю, вы могли бы взять этот класс и получить из таблицы «Пользователи» часовой пояс их и «рассчитать» подходящее время, мой код выглядел следующим образом;

//Get correct destination time
DateTime thedate = DateTime.Now;

string destinationtimezone = null;

//Load the time zone where the file is going
TimeZoneInformation tzi = TimeZoneInformation.FromName(this.m_destinationtimezone);

//Calculate
destinationtimezone = tzi.FromUniversalTime(thedate.ToUniversalTime()).ToString();

Этот класс имеет проблему в Windows Vista, которая вызывает сбой функции «FromIndex (int index)», но вы можете изменить код вместо использования функции:

    public static TimeZoneInformation FromIndex(int index)
    {
        TimeZoneInformation[] zones = EnumZones();

        for (int i = 0; i < zones.Length; ++i)
        {
            if (zones[i].Index == index)
                return zones[i];
        }

        throw new ArgumentOutOfRangeException("index", index, "Unknown time zone index");
    }

Вы можете изменить его на;

    public static TimeZoneInformation FromName(string name)
    {
        TimeZoneInformation[] zones = EnumZones();

        foreach (TimeZoneInformation tzi in zones)
        {
            if (tzi.DisplayName.Equals(name))
                return tzi;
        }

        throw new ArgumentOutOfRangeException("name", name, "Unknown time zone name");
    }
0 голосов
/ 22 августа 2008

Я разработчик PHP, поэтому я поделюсь тем, что знаю из PHP. Я уверен, что .NET будет включать что-то подобное.

В PHP вы можете получить разницу часовых поясов для времени сервера - так как вы предлагали отправлять электронные письма на сервер в разное время.

Каждый раз, когда вы добавляете пользователя, сохраняйте его временное смещение от времени сервера (или его часовой пояс в случае изменения часового пояса сервера).

Затем, когда вы указываете обновление, имейте автоматическое задание (Cron для сотрудников LAMP), которое запускается каждый час, проверяя, нужно ли отправлять электронное письмо. Делайте это, пока не осталось писем для отправки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...