これは複雑なテーマのようです。私のアプローチが単純すぎるかどうか教えてください。
基本的に私がやろうとしているのは、毎朝午前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 時に正確に送信する必要はなく、できれば望ましいので、そのリスクを冒してもかまいません。