3

私は毎正時に電子メールを送信する必要があるプログラムを書いていますが、ユーザーにとってローカルな時間です。

異なるタイム ゾーンに 2 人のユーザーがいるとします。ジョンはニューヨークにいて、フレッドはロサンゼルスにいます。サーバーはシカゴにあります。各ユーザーに現地時間の午後 6 時に電子メールを送信したい場合、John にはサーバー時間の午後 7 時に、Fred にはサーバー時間の午後 4 時に電子メールを送信する必要があります。

.NET/Sql Server でのこれに対する適切なアプローチは何ですか? すべてのタイム ゾーン情報を含む xml ファイルを見つけたので、スクリプトを作成してデータベースにインポートし、クエリを実行することを検討しています。

編集:「t4znet.dll」を使用し、.NET 側ですべての比較を行いました。

4

3 に答える 3

0

次の 2 つのオプションがあります。

  • 各ユーザーのメール アクションの調整時間をデータベースに格納します。次に、サーバー時間を保存された時間と比較します。混乱と移植性の問題を避けるために、すべての時刻を UTC で保存します。したがって、SERVER_UTC_TIME() == storedUtcTime のときにメールを送信します。
  • 各メール アクションの現地時間をデータベースに保存し、オンザフライで変換します。SERVER_UTC_TIME() == TO_UTC_TIME(storedLocalTime, userTimeZone) のときにメールを送信します。

アプリケーションに最も適したものを決定する必要があります。たとえば、すべてのユーザーのメール送信時間が常に同じである場合は、オプション (2) を使用する方が理にかなっています。イベント時間がユーザー間、さらにはユーザーごとに変わる可能性がある場合、オプション (1) を選択すると、開発とデバッグが容易になる可能性があります。いずれにせよ、ユーザーのタイムゾーンを知る必要があります。

*これらの関数呼び出しは、T-SQL での呼び出しがわからないため、明らかに疑似ですが、存在するはずです。

于 2008-08-22T15:44:23.033 に答える
0

私は PHP 開発者なので、PHP について知っていることを共有します。.NET にも同様のものが含まれると確信しています。

PHPでは、サーバー時間のタイムゾーンの違いを取得できます-サーバー上で異なる時間にメールを送信することを提案したように。

ユーザーを追加するたびに、サーバー時間 (またはサーバーのタイムゾーンが変更された場合はタイムゾーン) からの時間オフセットを保存します。

次に、更新を指定するときに、電子メールを送信する必要があるかどうかを確認するために 1 時間ごとにチェックを実行する自動化されたタスク (LAMP ユーザーの場合は Cron) を用意します。送信するメールがなくなるまでこれを行います。

于 2008-08-22T13:35:17.710 に答える
0

この優れた記事「世界時計と TimeZoneInformation クラス」でソリューションを補完できます。ローカル時刻と受信時刻を含む情報を含むファイルを送信する Web サービスを作成しました。この問題を処理できるように、このクラスを変更しました。まさに私が必要としていたように、それは完璧に機能しました。

このクラスを利用して、テーブル「ユーザー」からタイムゾーンを取得し、適切な時間を「計算」できると思います。私のコードは次のようになりました。

//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");
    }
于 2008-08-26T05:07:26.587 に答える