で実行される Windows サービスがあります。
テキサス起源のサーバー中央時間。
これにより、すべてのアクティブなリマインダーがチェックされ、ユーザーが希望するリマインダーの時間が比較され、ユーザーが要求した時間と一致する場合はリマインダーが送信されます。
シナリオ
- ユーザーは EST 出身です
- ユーザーが自分の Web サイトの UI を使用して * 1:25 PM *のリマインダーを設定しました
- 送信時に、私の C# ビジネス ロジックは、データベースに保存する前に、今回は UTC に変換します。それは「18:25:00」になります
- My Business ロジックは、すべてのアクティブなリマインダーを DB から取得します
- 現在の UTC 時間とリマインダーのセットアップ時間の 差が 5 分未満の場合、リマインダーの時間をチェックし、その顧客に通知を送信します。
これが私のロジックの書き方です
DateTime CurrentDate = DateTime.Now.ToUniversalTime();
TimeSpan currentTime = DateTime.Now.ToUniversalTime().TimeOfDay;
if (Reminder.DailyReminders.Any(x => currentTime.Subtract(x.ReminderTime).TotalMinutes < 5
&& currentTime.Subtract(x.ReminderTime).TotalMinutes > 0))
{
if (Reminder.ReminderMedhodID.Equals(1))
_email.ComposeEmail(Reminder);
}
私の問題は * currentTime * が常にユーザーが要求したリマインダー時間より 1 時間遅れているため、リマインダーが 1 時間遅れて送信されることです。
注:currentTimeは以下から
TimeSpan currentTime = DateTime.Now.ToUniversalTime().TimeOfDay;
これがこの要件を処理する最善の方法であるかどうかはわかりません。これが方法の 1 つであることを考慮して、この問題を解決する方法を手伝ってくれる人はいますか?
ピーターの答えに感謝
夏時間を考慮してユーザー入力時間を取る方法を教えてください。
これは私がこれまでに持っているものです
public TimeSpan ConvertToUTCTime(string dateStr)
{
DateTime localDateTime = DateTime.Parse(dateStr); // Local .NET timeZone.
DateTime utcDateTime = localDateTime.ToUniversalTime();
string clTimeZoneKey = TimeZone.CurrentTimeZone.StandardName;
TimeZoneInfo clTimeZone = TimeZoneInfo.FindSystemTimeZoneById(clTimeZoneKey);
DateTime clDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, clTimeZone);
if (clTimeZone.IsDaylightSavingTime(localDateTime))
{
// Get DayLight local time in UTC
// Yet to be implemented
}
return clDateTime.TimeOfDay;
}
これを使用してこれを機能させました http://msdn.microsoft.com/en-us/library/system.globalization.daylighttime.aspx