我使用hangfire来安排在用户指定的时间发送电子邮件提醒。当我在localhost上测试应用程序时,警报被安排在正确的时间,当我向Azure上托管的实时应用程序发送请求时,请求的安排时间比它应该晚一个小时。
我认为问题是我对DateTimeOffset缺乏了解。我在JobScheduler课程中所做的是
public class JobScheduler : IJobScheduler
{
private EmailManager _emailManager;
public JobScheduler(IAlertManager alertManager)
{
_alertManager = alertManager;
}
public string ScheduleRaiseDateAlert( DateDetail date)
{
DateTimeOffset jobRunTime = ConvertToDateTimeOffSet(date.CheckInTime);
return BackgroundJob.Schedule(()=> _alertManager.RaiseAlertAsync(date.Id, true), jobRunTime.DateTime);
}
private DateTimeOffset ConvertToDateTimeOffSet(DateTime futureDateTime)
{
futureDateTime = DateTime.SpecifyKind(futureDateTime, DateTimeKind.Utc);
DateTimeOffset ScheduleTime = futureDateTime;
return ScheduleTime;
}
}
date.CheckInTime 是应向用户发送电子邮件的日期时间
例如:如果 date.CheckInTime = 17/04/2018 19:02:00 当我在本地主机上发送请求时,将安排该作业日期和时间,当我将相同的请求发送到azure上托管的应用程序时,作业计划的时间是 17/04/2018 20:02:00
答案 0 :(得分:1)
AFAIK,DateTimeOffset.DateTime
将被视为本地日期时间,您可以查看发送至Kind
的{{1}}实例的jobRunTime.DateTime
属性。
对于支持BackgroundJob.Schedule
参数的BackgroundJob.Schedule
重叠方法,存储的 EnqueueAt 将是DateTimeOffset
参数的DateTimeOffset.UtcDateTime
。< / p>
对于DateTimeOffset
参数,存储的 EnqueueAt 将是添加指定TimeSpan的当前UTC日期时间。
此外,如果您将本地时间TimeSpan
实例传递给DateTime
,则存储的 EnqueueAt 将转换为相关的UTC日期时间。
由于您没有提供如何构建BackgroundJob.Schedule
,我建议您检查存储的任务以缩小此问题的范围。我使用了UseSqlServerStorage,对于这种方法,您可以检查DateDetail
表下的计划任务的状态。
HangFire.State
{"EnqueueAt":"2018-04-20T06:39:28.0305044Z","ScheduledAt":"2018-04-18T06:39:29.5398973Z"}
代表您创建此任务的UTC日期时间,ScheduledAt
代表触发任务的UTC日期时间。