1

ユーザーの現在の日付と時刻をサーバーの時刻と一致させる方法を理解するのに問題があります。

例:ユーザーが自分で登録できるWebサイトがあるとします。プロファイルオプションの1つは、ローカルタイムゾーンを選択できることです。このために、正しいタイムゾーンを選択できるドロップダウンメニューがあります。したがって、中国のユーザーはおそらく(UTC + 08:00)北京、重慶、香港、ウルムキを選択し、ロサンゼルスの別のユーザーは(UTC-07:00)マウンテンタイム(米国とカナダ)(私は推測)とパリの男が(UTC + 01:00)ブリュッセル、コペンハーゲン、マドリッド、パリを選択します。

Webアプリケーションは、特定のタイムゾーンを持つ米国のサーバーで実行されています...

今...これらすべてのユーザーは、来週の金曜日の19:00にローカルタイムゾーンで電子メール通知を受け取りたいと思うでしょう!!!

ここで私は迷子になっています...間違いなく次の金曜日の19:00は、これらすべてのユーザーにとって同じ時間ではありません...

プロファイルのタイムゾーンをマップして、私のサイトで実行されているサービスが来週の金曜日の19:00ユーザーのローカルタイムゾーンに電子メール通知を送信するようにするにはどうすればよいですか?

現在、この段階にあります...ドロップダウンメニューにすべてのタイムゾーンを入力して、ユーザーがプロファイルで現在のタイムゾーンを選択できるようにします。

ドロップダウンよりもページの読み込みにタイムゾーンが表示される場合:

    protected void Page_Load(object sender, EventArgs e)
    {
        ddlUserTimeZone.DataSource = GetTimeZones();
        ddlUserTimeZone.DataTextField = "Name";
        ddlUserTimeZone.DataValueField = "ID";
        ddlUserTimeZone.DataBind(); 
    }

    public Collection<TimeZoneItem> GetTimeZones()
    {
        Collection<TimeZoneItem> timeZones = new Collection<TimeZoneItem>();
        foreach (var timeZoneInfo in TimeZoneInfo.GetSystemTimeZones())
        {
            timeZones.Add(new TimeZoneItem 
            { 
                TimeZoneName = timeZoneInfo.DisplayName, 
                TimeZoneID = timeZoneInfo.Id 
            });

        }

        return timeZones;
    }

    public struct TimeZoneItem
    {
        public string TimeZoneName { get; set; }
        public string TimeZoneID { get; set; }
    }

さて、メールが正しい時刻に送信されるように、プロファイルのタイムゾーンを現在の時刻と一致させるのを手伝ってもらえますか?

前もって感謝します!

4

2 に答える 2

2

このサービスを設定しているだけですか?その場合は、ローカルタイムゾーンではなく、協定世界時(UTCまたはZulu)でWebサーバーとデータベースサーバーを実行します。そうすれば、すべてを管理するのがはるかに簡単になります。私はこれを難しい方法で学びました。

UTCは、以前はグリニッジ標準時と呼ばれていました。タイムゾーン+00:00です。米国やヨーロッパの現地時間のように夏時間については変更されません。

このタイムゾーンのことは苦痛であり、正しくする価値があります。一部の国には30分のタイムゾーンがあります。

いずれにせよ、各ユーザーの希望するタイムゾーンと、ユーザーが通知を希望する時刻がわかれば、時刻をローカルからUTCに変換して保存できます。

このようなことを試して、ユーザーの時間と分をUTCに取り込みます。(タイムゾーンの変換は、夏時間のルールに依存するため、日付が必要です。もう1つ複雑です。タイムゾーンが夏時間から標準に、またはその逆に切り替わる日に、通知のUTC時刻が変更されます。ほとんどの人次の通知(明日の通知)のUTC日時を再計算して、各通知を送信することでこれを処理します。このコードを検討してください。

TimeZoneInfo userLocal =            ;//user's time zone
int hour =                          ;//whatever the user wants
int minute =                        ;//whatever the user wants

DateTime tomorrow = DateTime.Now.AddDays(1);
int year = tomorrow.Year;
int month = tomorrow.Month;
int day = tomorrow.Day;
DateTime notificationTime = new DateTime(year,month,day,
                                         hour,minute,0, 
                                         DateTimeKind.Unspecified);
DateTime tomorrowNotificationTime = TimeZoneInfo.ConvertTimeToUtc(
                                         notificationTime,userLocal);

これにより、このユーザーの通知を明日配信するために必要なUTC時刻が、明日の日付の正しいタイムゾーンで取得されます。

于 2012-06-30T23:41:42.363 に答える
0

DateTimeは、理想的にはUTC形式でサーバーに保存する必要があります。

サーバーに次のデータがあります

  • ユーザーのタイムゾーン情報。
  • ユーザーが通知を必要とする時間。
  • サーバーの現在の現地時間。

    // Convert current local server time to UTC.
    var serverUtc = DateTime.UtcNow;
    
    // Convert UTC time to users local time. This gives you the date and time as per the user.
    var userTimeZone = TimeZoneInfo.GetSystemTimeZones()[0]; // just an example. Replace with actual value.
    var userCurrentTime = TimeZoneInfo.ConvertTime(serverUtc, userTimeZone);
    
    /*
    add a day to userCurrentTime till its Friday. Add/subtract minutes till its 7:00PM.
    */
    
    var expectedNotificationTimeUtc = TimeZoneInfo.ConvertTimeToUtc(userCurrentTime, userTimeZone);
    /*
    1. store the expectedNotificationTimeUtc as the time you want to send the email. 
    2. your service can check for users their expectedNotificationTimeUtc and 
         if the UtcNow is within an acceptable range of the that time, send the email.
    */
    
于 2012-07-01T01:04:35.937 に答える