Quatz.Net GetNextFireTime() 返回 "wrong timezone"

Quatz.Net GetNextFireTime() returning the "wrong timezone"

我目前正在从事一个使用 Quartz Scheduler 的项目。 我一直在研究一项功能,该功能使用以下方法显示有关当前活动作业的不同详细信息。

public IEnumerable<ActiveScheduleJob> GetAllActiveScheduls()
    {
        var activeScheduls = new List<ActiveScheduleJob>();

        try
        {
            IList<string> jobGroups = scheduler.GetJobGroupNames();
            // IList<string> triggerGroups = scheduler.GetTriggerGroupNames();

            ActiveScheduleJob ASJ;

            foreach (string group in jobGroups)
            {
                var groupMatcher = GroupMatcher<JobKey>.GroupContains(group);
                var jobKeys = scheduler.GetJobKeys(groupMatcher);
                foreach (var jobKey in jobKeys)
                {
                    var detail = scheduler.GetJobDetail(jobKey);
                    var triggers = scheduler.GetTriggersOfJob(jobKey);
                    foreach (ITrigger trigger in triggers)
                    {
                        ASJ = new ActiveScheduleJob();
                        ASJ.Group = group;
                        ASJ.Name = jobKey.Name;
                        ASJ.Description = detail.Description;
                        ASJ.TriggerKeyName = trigger.Key.Name;
                        ASJ.TriggerKeyGroup = trigger.Key.Group;
                        ASJ.TriggerGetTypeName = trigger.GetType().Name;
                        ASJ.TriggerState = scheduler.GetTriggerState(trigger.Key);
                        ASJ.NextFireTime = trigger.GetNextFireTimeUtc();
                        if (ASJ.NextFireTime.HasValue)
                        {
                            ASJ.NextFireTimeString = ASJ.NextFireTime.Value.LocalDateTime.ToString();
                        }

                        ASJ.PreviousFireTime = trigger.GetPreviousFireTimeUtc();
                        if (ASJ.PreviousFireTime.HasValue)
                        {
                            ASJ.PreviousFireTimeString = ASJ.PreviousFireTime.Value.LocalDateTime.ToString();
                        }
                        ASJ.FullJobString = $"Trigger Name: {ASJ.TriggerKeyName} | Trigger Group: {ASJ.TriggerKeyGroup} | Trigger State: {ASJ.TriggerState} | Trigger Get Type: {ASJ.TriggerGetTypeName} | Job Name: {ASJ.Name} | Job Group: {ASJ.Group} | Next Fire Time: {ASJ.NextFireTimeString} | Previous Fire Time: {ASJ.PreviousFireTimeString} | Description: {ASJ.Description}";
                        activeScheduls.Add(ASJ);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            logging.WriteLog(1, "JobScheduler", "GetAllActiveScheduls", "Hent alle aktive job+triggers", $"EXCEPTION MESSAGE: {ex.Message} | EXCEPTION INNER: {ex.InnerException}", LogType.Exception, "");
        }
        return activeScheduls;
    }

它自己的方法工作得很好,我的问题在于 GetNextFireTime() 方法以 UTC 给出它,比我的 GMT+1 / UTC+1 晚一个小时。

显示时:10-01-2018 07:00:00 +00:00

它应该显示:10-01-2018 08:00:00 +01:00

我查看了以下 link:Working With DateTimeOffset

并尝试使用 Marko Lahma 提到的可以转换 DateTimeOffset 的方法。但是我已经 运行 撞墙了,我无法转换它,因为 GetNextFireTime() returns 一个 DataTimeOffset?以及我尝试过的,无法转换为 Nullable 的内容。所以我有点不知所措

您可以将 DateTimeOffset 转换为本地 DateTimeOffset,然后将其转换为 DateTime。

var nextFireDateTime = trigger.GetNextFireTimeUtc()?.ToLocalTime().DateTime;

请注意 nextFireDateTime 可以为空。