我的 Java 应用程序需要每天向所有用户发送一封电子邮件。我想根据每个用户的当地时间在凌晨 2 点左右送达。因此,纽约的用户会在美国/纽约时间凌晨 2 点收到消息。洛杉矶的用户将在美国/洛杉矶时间凌晨 2 点收到该消息。我的邮寄过程每天每小时运行一次。
我计划在注册期间使用 HTML5 地理位置功能或 IP 地址地理位置来自动确定每个用户的时区。当然,如果这些值不正确,用户可以手动修改时区。我打算将选定的时区作为时区 ID 字符串存储在 User 对象中,例如“America/New_York”。这将作为字符串保存到数据库中,但如有必要,可以更改。
需要考虑的事项:
- 我需要考虑夏令时,所以用户总是在凌晨 2 点左右收到电子邮件。这意味着我不能只在用户对象中存储 GMT-8 或类似的 UTC 偏移量。洛杉矶一年中的一部分时间是 GMT-7,而其他部分时间是 GMT-8。
- 另一个 SO question有建议存储偏移信息的答案,但我不知道这将如何工作,因为不同地方的时间在一年中可能会发生变化。每当世界某处发生时区更改事件时,我不会更新我所有的用户对象时区。
- 我在我的应用程序中使用 JodaTime,所以如果有帮助,我可以利用它。
- 我正在使用 Hibernate 进行数据库查询,并希望找到一个可以在 Hibernate 查询中处理的解决方案,而无需在 Java 中处理数十万条用户记录。
我正在使用 Spring Scheduling cron 功能(通过 Quartz)在一天中的每小时 2 分钟运行一个方法。现在我的大多数用户都在 America/Los_Angeles,所以我手动强制所有邮件在太平洋时间凌晨 2:02 发送。以下方法在每小时 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
}
因此,我需要执行一个数据库查询,该查询将根据用户对象中的时区为我提供所有在凌晨 2:00 时具有本地时间的用户。关于如何做到这一点的任何想法?