【问题标题】:c# get next execution datetimec# 获取下一次执行日期时间
【发布时间】:2017-10-31 13:11:43
【问题描述】:

我有以下代码:

Dictionary<DayOfWeek, List<TimeSpan>> Daily = new Dictionary<DayOfWeek, List<TimeSpan>>();

我的想法是我可以在 Daily 字典中添加一天和时间。但是一个作业可以在同一天执行多次。

所以 Daily 可以是这样的:

{ "Monday" : [{"Hour":10, "Minute": 15}, {"Hour": 8, "Minute":5}] }

现在我想获取下一个执行日期时间。

private void UpdateNextExecutionTime()
    {
        TimeSpan t = new TimeSpan(15, 15, 0);
        DayOfWeek current = DateTime.Now.DayOfWeek;

        DayOfWeek tmp = current;
        TimeSpan time = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);

        int cur = (int)current;
        for(int i = 0; i < 7; i++) {
            if(Daily.ContainsKey((DayOfWeek)cur)) {
                tmp = (DayOfWeek)cur;

                /* stuck */

                continue;
            }

            cur++;
            if (cur >= 7)
                cur = 0;
        }
    }

我设法在 Daily 词典中找到了即将到来的第一天(包括今天),但我被困在获取时间上。

我怎么能做到这一点?

【问题讨论】:

  • 为什么不改用System.TimeSpan?我认为没有必要尝试滚动您自己的类型。
  • 也就是说,尚不清楚您要做什么。显示您目前拥有的代码。
  • @Igor 将自定义类型替换为 Timespan,希望添加的代码能让事情更清晰。
  • 您可以使用DateTime.TimeOfDay 获取代表DateTime 的时间部分的TimeSpan,而不是使用所有单独的部分创建一个。
  • 按排序顺序维护TimeSpans 的列表(或在列表完成时对它们排序一次),然后检索下一个只是碰撞索引。但是,您可能会编写更多与调度相关的代码,而且这并非易事。考虑使用现有的解决方案,例如 this 或(如果您不介意矫枉过正的话)Quartz.NET

标签: c# datetime scheduled-tasks


【解决方案1】:

假设t 是您要查找下一个执行时间的时间点,请将其放在您“卡住”的位置(编辑;刚刚意识到您已更改为使用TimeSpan在您的列表中):

var execTimes = Daily[tmp];
if (execTimes != null) {
    var nextTime = execTimes.OrderBy(x => x).FirstOrDefault(x => x > t);
    if (nextTime != default(TimeSpan)) {
        // do something...
    }
}

【讨论】:

    【解决方案2】:

    你也可以在 TimeSpan 中有一天,

    这是一个查找下一个日期的简单示例:

    var schedule = new List<TimeSpan>{
        new TimeSpan(0,16,30,0),
        new TimeSpan(1,16,30,0),
        new TimeSpan(5,16,30,0)
    };
    
    var monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + 1);
    var fromMonday = DateTime.Now - monday;
    var next = schedule.OrderBy(t => t).FirstOrDefault(t => t > fromMonday);
    
    Console.Write(monday + next - DateTime.Now);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2013-12-13
      相关资源
      最近更新 更多