DateTime,.AddSeconds()不起作用?

时间:2009-10-02 14:30:17

标签: c# datetime

我已经在这个问题上摸不着头几个小时了,我已经和同事一起起草了,我们都迷失了。这可能是新浓缩咖啡机过多咖啡的情况,或者是周五的事实......我们不确定!

我有以下方法:

private void calcuateEstimatedExecutionTimesForDueJobs(List<TestJob> dueJobs)
{
    DateTime rollingTime = DatabaseConnection.getNow();

    foreach (TestJob job in dueJobs)
    {
        job.setEstimatedStart(rollingTime);

        double estimatedRuntime = job.getEstimatedRuntime();

        rollingTime = rollingTime.AddSeconds(estimatedRuntime);

        job.setEstimatedFinish(rollingTime);
    }
}

目的是处理我们的应用程序排队等待提供的“TestJobs”列表。我们的TestJob知道它可能“运行”需要多长时间,所以我希望在这里使用这些信息来预测“开始”和每个TestJob的“完成”时间。

不幸的是,rollingTime永远不会改变。虽然job.getEstimatedRuntime()总是返回一个正的double,但在当前的TestJob上调用AddSeconds()并传递此值无效。

我的代码中是否有错误,或者更险恶的内容?

更新:我注意到这个问题仍然有一些观点。对于那些像我一样遇到奇怪问题的人,我记得只需重新启动Visual Studio /重新启动即可解决这个问题。我想这个问题还时不时出现......(咳咳......)!

3 个答案:

答案 0 :(得分:5)

根据您的代码创建一个小型测试程序:

  public class Program
  {
    public static void Main(string[] args)
    {
      List<TestJob> jobList = new List<TestJob>();

      jobList.Add(new TestJob() { ID = 1 });
      jobList.Add(new TestJob() { ID = 2 });
      jobList.Add(new TestJob() { ID = 3 });
      jobList.Add(new TestJob() { ID = 4 });

      CalcuateEstimatedExecutionTimesForDueJobs(jobList);

      foreach (TestJob job in jobList)
      {
        Console.WriteLine("{0} {1} {2}", job.ID, job.StartDate, job.FinishedDate);
      }
      Console.ReadLine();
    }

    private static void CalcuateEstimatedExecutionTimesForDueJobs(List<TestJob> dueJobs)
    {
      DateTime rollingTime = DateTime.Now;

      foreach (TestJob job in dueJobs)
      {
        job.SetEstimatedStart(rollingTime);

        double estimatedRuntime = job.GetEstimatedRuntime();
        rollingTime = rollingTime.AddSeconds(estimatedRuntime);

        job.SetEstimatedFinish(rollingTime);
      }
    }
  }

  public class TestJob
  {
    public int ID { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime FinishedDate { get; set; }
    public void SetEstimatedStart(DateTime date)
    {
      this.StartDate = date;
    }
    public void SetEstimatedFinish(DateTime date)
    {
      this.FinishedDate = date;
    }

    public double GetEstimatedRuntime()
    {
      return 42; //Answer to Life, the Universe, and Everything
    }

  }

显示一切都按预期工作。控制台输出是:

1 02.10.2009 17:08:43 02.10.2009 17:09:25
2 02.10.2009 17:09:25 02.10.2009 17:10:07
3 02.10.2009 17:10:07 02.10.2009 17:10:49
4 02.10.2009 17:10:49 02.10.2009 17:11:31

据我所知,这是正确的。 请仔细检查TestJob类中的相关代码并调试/记录所有内容。

答案 1 :(得分:4)

OBS:ref https://msdn.microsoft.com/en-us/library/system.datetime.addseconds(v=vs.110).aspx

此方法不会更改此DateTime的值。相反,它返回一个新的DateTime,其值是此操作的结果。

答案 2 :(得分:2)

这应该没有任何问题。

我建议您尝试将问题转换为short but complete program which demonstrates the problem。您可能还想添加一些登录 - 日志rollingTime和  每次迭代都estimatedRuntime

顺便问一下,您在C#中使用Java约定的原因是什么?