Hangfire循环任务指定特定小时后无法正常运行如何解决?
问题原因
Hangfire默认使用UTC时间计算cron表达式的触发时间,和你所处的本地时区存在时差,因此按本地时间编写的cron表达式无法按预期触发。比如你当前本地时间是上午11:19,若处于东八区则UTC时间仅为3:19,自然匹配不到11点的触发规则。
解决方法
方案1(推荐):显式指定Hangfire使用的时区
修改Hangfire的全局配置,调用UseTimeZone方法传入你所在的时区即可:
GlobalConfiguration.Configuration .UseSqlServerStorage("Server=.\\sqlexpress;Database=HangfireTest;Integrated Security=SSPI;") // Windows系统时区ID用这行 .UseTimeZone(TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")); // Linux/macOS系统时区ID用下面这行 // .UseTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai"));
方案2:按UTC时间换算cron表达式的小时位
如果不想改时区配置,可以把你需要的本地小时换算成UTC小时再写到cron里,比如东八区要11点触发,减去8小时时差,UTC为3点,cron写成0-59 3 * * *即可。该方案不推荐,夏令时调整、时区变更时会出现触发异常。
注意事项
修改配置后需要删除之前已经创建的同名LiveFixtures定时任务,再重新添加,旧任务会沿用创建时的时区配置,不会自动同步新的全局时区规则。
内容的提问来源于stack exchange,提问作者nam vo
相关产品推荐
相关产品推荐

