私のJavaアプリケーションは、すべてのユーザーに1日1回メールを送信する必要があります。各ユーザーの現地時間に基づいて、午前2時頃に配信したいと思います。したがって、ニューヨークのユーザーは、午前2時のアメリカ/ニューヨークの時間にメッセージを受け取ります。ロサンゼルスのユーザーは、午前2時のアメリカ/Los_Angelesの時間にメッセージを受け取ります。私の郵送プロセスは、1日の1時間に1回実行されます。
HTML5ジオロケーション機能またはIPアドレスジオロケーションを使用して、サインアップ時に各ユーザーのタイムゾーンを自動的に決定する予定です。もちろん、これらの値が正しくない場合、ユーザーはタイムゾーンを手動で変更できます。選択したタイムゾーンを「America/New_York」などのタイムゾーンID文字列としてUserオブジェクトに保存するつもりです。これは文字列としてデータベースに保持されますが、必要に応じて変更できます。
考慮事項:
- 夏時間を考慮する必要があるため、ユーザーは常に午前2時頃にメールを受信します。これは、GMT-8または同様のUTCオフセットをユーザーオブジェクトに保存することはできないことを意味します。ロサンゼルスはGMT-7であり、他の部分はGMT-8です。
- 別のSOの質問には、オフセット情報を保存することを提案する回答がありますが、さまざまな場所の時間が1年を通して変化する可能性があるため、それがどのように機能するかわかりません。世界のどこかでタイムゾーン変更イベントが発生するたびに、すべてのユーザーオブジェクトのタイムゾーンを更新するつもりはありません。
- 私は自分のアプリケーションでJodaTimeを使用しているので、それが役立つ場合はそれを利用できます。
- 私はデータベースクエリにHibernateを使用しており、Javaで数十万のユーザーレコードを処理する必要なしに、Hibernateクエリで処理できるソリューションを見つけたいと考えています。
私はSpringSchedulingcron機能(Quartz経由)を使用して、1日の1時間ごとに1時間の2分後にメソッドを実行しています。現在、私のユーザーのほとんどはAmerica / Los_Angelesにいるので、すべてのメールを太平洋時間の午前2:02に手動で送信するように強制しています。次のメソッドは、毎時1時02分に実行されますが、手動で時刻をチェックし、ロサンゼルスの現在の時刻が2:00時間である場合にのみ続行します。これは、他の場所のユーザーが午前2時とは異なる時間にメールを受信することを意味します。
@Scheduled(cron="0 2 * * * *")
public void sendDailyReportEmail() {
DateTime now = new DateTime(DateTimeZone.forID("America/Los_Angeles"));
if (now.getHourOfDay() != 2) {
log.info("Not 2AM pacific, so skipping email reports");
return;
}
// send email reports
}
したがって、必要なのは、Userオブジェクトのタイムゾーンに基づいて、午前2時の現地時間を持っているすべてのユーザーを取得するデータベースクエリを実行することです。これを達成する方法について何か考えはありますか?