C#每日检测指定时间触发缓存数据发送的实现问题
解决方案
方案1:按你指定的UTC时间判断
既然你明确东部时间下午4点对应UTC时间8点,直接判断当前UTC时间的时间点即可。考虑到代码不会刚好卡在整秒执行,建议放宽到1分钟内的误差:
var timeNowUtc = DateTime.UtcNow; // 匹配UTC时间8:00:00至8:00:59的时间段 if (timeNowUtc.Hour == 8 && timeNowUtc.Minute == 0) { // 执行发送缓存内容的方法 await SendCachedItemsAsync(); }
方案2:严格基于美国东部时间判断(含夏令时)
如果需要自动适配夏令时切换(美国东部时间分EST和EDT),用TimeZoneInfo做时区转换更准确:
// 获取美国东部时区(Windows系统用这个ID) var easternTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); // 跨平台应用(Linux/macOS)请改用这个ID: // var easternTimeZone = TimeZoneInfo.FindSystemTimeZoneById("America/New_York"); // 将UTC时间转换为东部时间 var timeNowEastern = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, easternTimeZone); // 匹配东部时间16:00:00至16:00:59的时间段 if (timeNowEastern.Hour == 16 && timeNowEastern.Minute == 0) { // 执行发送缓存内容的方法 await SendCachedItemsAsync(); }
额外提示
- 仅靠if语句轮询的话,必须保证代码持续运行(比如放在后台服务的循环里),否则很容易错过触发时机。更可靠的方式是用定时任务框架,比如Hangfire、Quartz.NET,直接配置每日UTC8点(或东部时间16点)执行任务。
- 你设置的缓存24小时绝对过期,刚好和每日触发的频率匹配,能确保每次触发时拿到的是最新的缓存内容。
内容的提问来源于stack exchange,提问作者Amr Mashrah
相关产品推荐
相关产品推荐

