Spring @Scheduled注解配置zone为EST时区未按预期执行问题
问题原因
- 你的代码中
@Scheduled注解zone参数使用的"EST"是过时的三字母时区缩写,Java 从1.1版本开始就不推荐使用这类缩写配置时区:一方面这类缩写存在多地区歧义(比如EST同时可指代美国东部标准时间、澳大利亚东部标准时间),解析时容易匹配到错误的时区规则;另一方面EST本身仅代表不含夏令时的标准时间,无法覆盖美国东部地区全年的夏令时切换需求。 - 当三字母时区缩写解析失效时,Spring会 fallback 到JVM默认时区(你的服务运行环境默认是印度标准时间IST)做cron表达式计算,最终导致触发时间和预期不符。
解决方案
将zone参数的值替换为IANA标准时区ID America/New_York即可,修正后的代码如下:
@Scheduled(cron = "0 0 5 * * MON-FRI", zone = "America/New_York") public void jobRunDaily() { logger.info("jobRunDaily : called"); this.sendEmailDaily(); }
America/New_York是美国东部地区的官方标准IANA时区标识,会自动适配夏令时/冬令时切换,全年都会按照你预期的美国东部当地时间每周一到周五早5点触发任务。- 如果你需要查询其他地区的合法时区ID,可以在代码中执行
TimeZone.getAvailableIDs()打印JVM支持的所有IANA时区列表做校验。
验证建议
你可以临时把cron表达式调整为距离当前时间1-2分钟的测试值,启动服务验证触发时间是否符合预期,避免等到正式执行时段才发现配置问题。
内容的提问来源于stack exchange,提问作者Aaina Arora
相关产品推荐
相关产品推荐

