6

これは複雑なテーマのようです。私のアプローチが単純すぎるかどうか教えてください。

基本的に私がやろうとしているのは、毎朝午前7時にユーザーのリストに電子メールのリマインダーを送信することです(リマインダーが表示される場合のみですが、それは重要ではありません)。もちろん、世界中のすべての人のサーバーの場所に基づいて、午前 7 時の時刻は異なります。

計画は、登録時にユーザーから JavaScript を介して GMT オフセット時間まで収集することです。

var today = new Date();  
var offset = -(today.getTimezoneOffset()/60);

簡単なことですが、これでオフセット時間がわかり、それを残りのユーザー データと共にデータベースに保存します。サーバー側では、1 時間ごとに実行される TimerTask がセットアップされています。システムの時間 (たとえば午前 5 時) を収集し、目標時間 (この場合は 2 (7-5)) からどれだけ離れているかを確認し、システムのオフセット時間 (この場合は -5) を取得してから、プルします。 -3 (-5 + 2) の GMT オフセット時間を持つデータベースからのすべてのユーザーは、電子メールの送信などを行います。プロセスを続行します。これは次の 1 時間に再度実行され、タイム ゾーン オフセットが -4 のすべてのユーザーが収集されます。これは実際に機能するものですか、それとも何か不足していますか?

Calendar systemTime = Calendar.getInstance();
int targetHour = 7;
int currentHour = systemTime.get(Calendar.HOUR_OF_DAY); //Its 5 am.
int difference = targetHour - currentHour; //2
int zoneOffset = systemTime.get(Calendar.ZONE_OFFSET) / (1000*60*60); //-5
int targetZone = zoneOffset + difference; //-3

List<User> users = userDAO.findByZoneOffset(targetZone);
for(User user : users) {
    //Send email or whatever I want to do with these users.
}

クライアントのタイム ゾーンが正しく設定されていない可能性があることは理解していますが、リマインダーを午前 7 時に正確に送信する必要はなく、できれば望ましいので、そのリスクを冒してもかまいません。

4

1 に答える 1

1

計画は、登録時にユーザーからJavaScriptを介してGMTオフセット時間に収集することです

タイムゾーンを一貫して取得するには、それだけでは不十分です。サマータイムは考慮していません。したがって、ユーザーが夏時間を遵守している場所にいる場合、約半年間午前 6 時に電子メールを受信するか、約半年間午前 8 時に電子メールを受信します。IP ジオロケーション + オフセットに基づいてタイム ゾーンを推測する方がよい場合があります。

1 時間ごとに実行される TimerTask をセットアップしています。

それよりも頻繁に走ることをお勧めします。そうしないと、メールを送信する直前に目が覚めてしまう可能性があります。そのため、再び眠りにつくと、次回は 7:59 にメールを送信します...現在の時間では 8:59 になる可能性があります。クライアントの DST の変更に基づくスキーム。その時点で、意図した送信時間から 2 時間近く遅れています。

システムアワーを収集する

それもしないでください。この時点で考慮すべき2 つのタイム ゾーンがあり、サーバーのタイム ゾーンはまったく関係ありません。クライアントの現地時間に変換するまで UTC を使用します。それは人生をはるかにシンプルにするでしょう。まだ を使用している場合はCalendar、タイム ゾーンを設定するだけでこれを行うことができます。

コードを見ると、完全に一致する時間でチェックしている場合、多数のユーザーを完全に見逃してしまう可能性があるようです。(たとえば) 3:59 に 1 回、次に 4:01 に 1 回実行すると、4 時に実行しなければならなかった人を見逃すことになります。各ユーザーに最後にメールを送信したのはいつかを追跡することをお勧めします -または、最後に走ったとき-そしてそれを使用して、常に全員を捕まえるようにします.

最後に、Joda Timeを使用することを強くお勧めします。これは非常にクリーンな日付/時刻 API であり、コードの適切なポイントで使用する適切な概念について考えるのに役立ちます。

于 2012-12-10T07:15:40.737 に答える