- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的 Java 应用程序需要每天向所有用户发送一封电子邮件。我想根据每个用户的本地时间在凌晨 2 点左右送达。因此,纽约的用户会在美国/纽约时间凌晨 2 点收到消息。洛杉矶的用户将在美国/洛杉矶时间凌晨 2 点收到消息。我的邮寄流程将在一天中每小时运行一次。
我计划在注册期间使用 HTML5 地理定位功能或 IP 地址地理定位来自动确定每个用户的时区。当然,如果这些值不正确,用户可以手动修改时区。我打算将选定的时区作为时区 ID 字符串存储在用户对象中,例如“America/New_York”。这将作为字符串保存到数据库中,但如果需要可以更改。
需要考虑的事项:
我正在使用 Spring Scheduling cron 功能(通过 Quartz)在一天中的每小时整点过 2 分钟运行一个方法。现在我的大部分用户都在美国/洛杉矶,所以我手动强制所有邮件在太平洋时间凌晨 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 的所有用户。关于如何实现这一点有什么想法吗?
最佳答案
我对此进行了更多思考并找到了可能的解决方案。我还没有实现它,但我认为它应该可以工作。基本上,它涉及执行以下查询(注意:这是特定于 MySQL 的):
select * from members where hour(convert_tz(now(),'UTC',timezone)) = 3;
此查询通过执行以下操作选择当前本地时间在凌晨 3 点到凌晨 3:59 之间的所有成员:
now()
获取当前服务器时间,这是 UTC 时间,因为数据库服务器配置为 UTC 时间。 convert_tz()
函数将该时间转换为成员表的 timezone
列中指定的成员时区。请注意,Member 类包含格式为“America/Los_Angeles”的时区字段。hour()
函数检查现在是几点,看是否是 3
,即凌晨 3 点。我有点担心每小时为系统中的每个成员进行时区转换和计算。我将不得不进行测试,看看它给数据库带来了什么样的负载,但它可能会因数百万甚至 10k 的用户而窒息。
一个可以显着减轻负载但不那么优雅的替代方法是执行以下操作(注意此代码未经测试!):
@Scheduled(cron="0 2 * * * *")
public void sendDailyReportEmail() {
Query query = session.createQuery(
"select distinct m.timezone from Member m");
List<String> timezones = query.list();
for (String timezone : timezones) {
DateTime now = new DateTime(DateTimeZone.forID(timezone));
if (now.getHourOfDay() == 3) {
Query query2 = session.createQuery(
"from Member where timezone = :zone");
query2.setParameter("zone", timezone);
List<Member> members = query2.list();
// send email reports
}
}
}
此代码执行此操作:
这会在每小时开始时增加一点额外开销,但不需要针对每个用户的时区处理。系统实际使用的唯一时区可能只有几十个。我不太可能在所有 500 多个时区都有成员。
最后一件事。我没有在凌晨 2 点发送电子邮件,而是将其移至凌晨 3 点。这是因为 Spring 夏令时更改时,时间从凌晨 2 点更改为凌晨 3 点。所以没有凌晨 2:02 这样的事情,这意味着那天不会发送电子邮件。此外,在秋天,系统可以向每个用户发送 2 封电子邮件,因为一个小时会重复。我需要查明非美国时区是否会在不同时间更改时间,因为凌晨 3 点可能在其他地方是个问题。
关于java - 根据用户的本地时区在特定时间执行日常操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3706938/
在我的 Rails (3.0) 应用程序中,我使用助手 time_zone_select() 来使用时区。它生成时区名称,如“(GMT+01:00) Paris”... 但这些名称与 MySQL 中的
我正在解析格式为的日期: SimpleDateFormat formatter = new SimpleDateFormat("EE MMM dd HH:mm:ss Z yyyy"); 当我这样做的时
我在 Android 上使用 ACTION_TIMEZONE_CHANGED Intent 过滤器来响应时区更改。 我注意到 Jodas 当前时区此时没有更新,使用:DateTimeZone.getD
我有一个旧版 Windows 应用程序,它从数据库读取数据。其中一列是“TimeZoneInfoId”。在传统世界中,它是由另一个 Windows 应用程序编写的,因此它存储 Windows 字符串:
我是数据库开发新手,目前从事 MySQL 工作。我有一列包含美国的所有时区。我希望能够获取每行中每个时区的当前时间(只有时间,没有日期)。 时区数据如下:+05:00、-03:00 等等 这就是我尝试
我正在尝试了解 session 时区在 PostgreSQL 中的工作原理。 当我将 session 时区设置为“01:00”时,返回日期为“-01:00”。符号总是颠倒的,我不理解这种行为。 这怎么
我写入我的 mongoDB 数据库,例如开始日期,开始日期始终是一周中的星期一(我使用并且我在欧洲中部时区)。 "startDate" : ISODate("2014-12-28T23:00:00Z"
是否有详尽的 MySQL 时区列表? 似乎 MySQL 设置中 time_zone 的有效值取决于主机操作系统,但我一直无法找到可能值的列表。 我需要时间显示卡尔加里本地时间。 最佳答案 默认情况下,
我已经在 config/app.php 中配置了时区至 Europe/Lisbon . 如果我做 return date_default_timezone_get(); , 返回 Europe/Lis
我在整个脚本中广泛使用 unix 时间,通常我将时区设置如下: date_default_timezone_set('Europe/London'); 这一直工作正常,直到上周末时钟回退一个小时,我怀
我有一个字符串,2013-10-07T23:59:51.205-07:00,想将其转换为 Java 日期对象。我收到解析错误。 date = new SimpleDateFormat("yyyy-MM
如何更改日志文件名中的 log4j 时区? 我的 log4j.xml 文件:
在JAVA中,如何确定所有日期都作为GMT日期返回? 例如,即使我尝试使用GMT语言环境强制使用DateFormat,它也会应用某种逻辑来检索BST日期。 public static void mai
好吧,这是我遇到过的最奇怪的错误之一! 首先:我不是 Python 程序员,该脚本是由 friend 编写的(我认为他的大部分内容来自示例)。 该脚本的用途:将日历信息(CET 时间)从 XML 文件
我们有一个网站,目前在某个时间(由用户选择)运行拍卖,这一切都工作正常,因为当服务器到达该时间时,拍卖就会开始。然后我们必须添加时区,具体取决于用户居住的地方。然后,根据所选的下拉菜单,这将增加或减少
我陷入了这个逻辑。我正在开发一个消息调度项目,我的客户来自不同的国家。让我们考虑一下亚洲(不遵守夏令时)和美国/纽约(遵守夏令时)。 现在,我正在编写以下查询来获取距当前时间 10 分钟间隔内的时间表
我尝试返回特定时区的值,但我遇到了一些奇怪的响应行为: SELECT created_at AT TIME ZONE 'US/Pacific' - created_at, NOW() A
我正在尝试将不带时区值(例如“31.05.2015”)的字符串转换为 NSDate。 我的 DateFormatter 有什么问题?它返回日期 2015-05-31 22:00:00 +0000当我尝
我已经成功地将我的本地 tzinfo 导入到 mysql 中,我几乎已经了解了关于如何存储和使用这些数据的所有细节,除了一个字段。有一个名为 Transition_type_id 的数字字段(在表 t
为什么以下行返回的 TimeZone 显示不正确的时间: TimeZone.getTimeZone("America/Ottawa") 现在显示晚上 10:26 [亚特兰大时间现在是 6:26,Ott
我是一名优秀的程序员,十分优秀!