原来这似乎是一个复杂的主题,如果我的方法太简单,请告诉我。
基本上我要做的是在每天早上 7 点向用户列表发送电子邮件提醒(仅当他们有提醒出现时,但除此之外)。当然,早上 7 点是在不同的时间,这取决于全世界每个人的服务器位置。
计划是在用户注册时通过 javascript 从用户那里收集到 GMT 偏移时间:
var today = new Date();
var offset = -(today.getTimezoneOffset()/60);
很简单,我现在知道偏移时间并将其与其他用户数据一起存储在数据库中。现在服务器端我设置了一个每小时运行一次的 TimerTask。我收集系统时间(比如早上 5 点),看看距离我的目标时间有多远(在本例中为 2 (7-5)),获取系统偏移小时(在本例中为 -5),然后拉数据库中所有 GMT 偏移小时为 -3 (-5 + 2) 的用户,然后发送电子邮件等。此时我假设我知道时区偏移为 -3 的每个人的早上 7 点,我可以继续该过程。这将在下一小时再次运行并收集时区偏移为 -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 点准确发出并不是绝对必要的,只是更可取。