代码之家  ›  专栏  ›  技术社区  ›  Carsten

夸茨。Net GetNextFireTime()返回“错误时区”

  •  1
  • Carsten  · 技术社区  · 7 年前

    我目前正在从事一个使用Quartz调度器的项目。 我一直在开发一个功能,使用以下方法显示当前活动作业的不同详细信息。

    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

    我查看了以下链接: Working With DateTimeOffset

    试着用什么 Marko Lahma 上述方法可用于转换DateTimeOffset。但我遇到了一堵无法转换的墙,因为GetNextFireTime()返回DataTimeOffset?而我所尝试的,无法转换可为null的东西。所以我有点不知所措

    1 回复  |  直到 7 年前
        1
  •  2
  •   Rabban    7 年前

    您可以转换 DateTimeOffset 本地DateTimeOffset和DateTime。

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

    请注意 nextFireDateTime 可以为null。