Как отправлять напоминания в нужное время пользователям в разных часовых поясах? - PullRequest
4 голосов
/ 12 июля 2011

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

Итак, у меня есть пользователи из разных часовых поясов.

ID         DateTimeUTC               TimeZoneID            

1          2011-07-12 02:15:15.000   TimeZneID1
2          2011-07-13 16:00:00.000   TimeZneID2
3          2013-11-03 17:00:00.000   TimeZneID3
4          2011-08-22 03:00:00.000   TimeZneID4
5          2011-07-16 22:00:00.000   TimeZneID5

Создайте запланированный процесс, который будет запускаться каждые 15 минут, и выполните следующие шаги:

  1. Получить записи;
  2. Вторым является преобразование DateTimeUTC в Time для правильного часового пояса
  3. Сравнить, если оно совпадает
    a.Отправить напоминание
    var tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZneID1);<br> var local = TimeZoneInfo.ConvertTimeFromUtc(DateTimeUTC, tzi);<br> var timeNow = TimeZoneInfo.ConvertTimeFromUtc(DateTime.Now, tzi);<br> if(local == timeNow)<br> SendReminder();<br>

Это эффективный способ?это правильный путь?

Ответы [ 4 ]

8 голосов
/ 12 июля 2011

Если значения даты / времени уже указаны в UTC в базе данных, вам не нужно выполнять любое преобразование, конечно ... вам просто нужно посмотреть, соответствует ли текущий момент времени UTC совпадению,и если так, отправьте напоминание.

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

1 голос
/ 12 июля 2011

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

if ( dateTimeUtc == DateTime.UtcNow )
{
    // If your reminder needs to display the local time, pass it in:
    var tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZneID1);
    SendReminder(TimeZoneInfo.ConvertFromUtc(DateTime.UtcNow, tzi));
}

Обратите внимание, что DateTime.Now находится в local время;Вы хотите DateTime.UtcNow для согласованности во всех часовых поясах.

Еще одна вещь, о которой следует знать, это то, что вы запускаете свой планировщик задач каждые 15 минут, поэтому шансы на совпадение в 02:15:15 точно невелики,Как правило, вы хотите проверить, не всплыло ли время напоминания с момента последнего запуска :

var currentRun = DateTime.UtcNow;
foreach ( dateTimeUtc in GetReminderDateTimes() )
{
    if ( dateTimeUtc > lastRun && dateTimeUtc <= currentRun )
    {
    }
}
lastRun = currentRun;
1 голос
/ 12 июля 2011

По-моему, это может быть слишком сложно.Так как вы храните вещи в UTC, имейте напоминания в UTC и сопоставляйте в UTCЗатем просто свяжите напоминания с пользователями, которым вы хотите напомнить.

0 голосов
/ 28 июля 2011

Я хочу заняться схожими вещами и обсуждаю, какой подход будет подходящим. По сути, я пишу приложение, которое отправит сообщение для конкретной страны в полночь (по местному времени). У меня есть около 100 таких стран, и я также должен помнить о летнем сбережении. Я могу думать только о 2 способах сделать это, 1. Создайте соответствующую ветку для каждой страны, которая просыпается каждый час или около того, проверяет, наступила ли полночь (по местному времени), и отправляет сообщение. По сути, я буду создавать 100 потоков, ничего не делая большую часть времени. 2. При таком подходе будет только один таймер, который проверяет каждую минуту или 30 секунд местного времени для 100 стран и отправляет сообщение. Там должна быть некоторая дополнительная логика, так как никогда не будет точного полуночного матча. Не уверен, есть ли лучший способ справиться с ситуацией выше. Было бы здорово, если бы я мог получить некоторые идеи / предложения здесь. Спасибо, SP.

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