日期时间计时器间隔不会更改添加月份的速度

时间:2013-05-14 17:13:49

标签: c# datetime

DateTime newDate = new DateTime(2013, 1, 1);

void AddTime()
{

   timer1.Interval = 600000;  
   timer1.Enabled = true;
   timer1.Tick += new EventHandler(timer1_Tick);
   timer1.Start();
}
void timer1_Tick(object sender, EventArgs e)
{
    newDate = newDate.AddMonths(+3);
    lblDate.Text = newDate.ToString();

}

出于某种原因,更改timer1.Interval不会改变添加到newDate的3个月的速度,它始终是不变的。我想让1分钟的现实生活时间等于3个月。 我正在使用C#。

4 个答案:

答案 0 :(得分:1)

您的初始计时器间隔有点大。以下是完整的样本申请。按预期工作

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        DateTime newDate = new DateTime(2013, 1, 1);
        public Form1()
        {
            InitializeComponent();
            AddTime(); // call the method, otherwise timer will not start 
        }
        void AddTime()
        {
            timer1.Interval = 60000; // every minute (1 minute = 60000 milliseconds)
            timer1.Enabled = true;
            timer1.Tick += new EventHandler(timer1_Tick);
            timer1.Start();
        }
        void timer1_Tick(object sender, EventArgs e)
        {
            newDate = newDate.AddMonths(3); 
            label1.Text = newDate.ToString();
        }
        // if you need to set timet interval after timer start, do as below 
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            timer1.Interval = 30000; // set interval 30 seconds 
            timer1.Start();
        }
    }
}

答案 1 :(得分:0)

确保值.Interval是您想要的值。 你有600 000 600秒或10分钟。 你有足够的时间来举办活动吗? 调试它并进行破坏。

答案 2 :(得分:0)

你的间隔目前太高了,它是600秒而不是60:

DateTime newDate = new DateTime(2013, 1, 1);
void AddTime()
{

   timer1.Interval = 60000;  // was 600 seconds, now 60
   timer1.Enabled = true;
   timer1.Tick += new EventHandler(timer1_Tick);
   timer1.Start();
}

void timer1_Tick(object sender, EventArgs e)
{
    newDate = newDate.AddMonths(3); // + sign shouldn't be here
    lblDate.Text = newDate.ToString();
}

修改: 现在我看到你现在没有调用AddTime(),并且不清楚它在哪里做。没有更多信息很难说,但如果你使用Winforms,你可以使用表单的加载事件。或者如果它是一个类,你可以使用构造函数来调用它。

基本上是初始化您正在使用的对象的方法。

答案 3 :(得分:0)

你的方式错了。首先将“游戏时间”的 RATIO 计算为“正常时间”。然而,几个月是有问题的,因为一个月中的天数是可变的。相反,我们可以使用四分之一(365/4)并从那里开始工作。使用秒表跟踪已经过了多长时间,并将其添加到参考日期以获得“实时”。那么,“游戏时间”就是经过的时间乘以比率,然后加到参考时间。使用此模型,Timer Interval() IRREVELANT ;我们可以每分钟更新一次,每秒一次,或每秒四次,并且确定真实/游戏时间的代码完全相同......当我们更新显示时,所有时间都保持准确:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // update once per second, but the rate here is IRREVELANT...
        // ...and can be changed without affecting the real/game timing
        timer1.Interval = 1000; 
        timer1.Tick += new EventHandler(timer1_Tick);
    }

    private DateTime dtReal;
    private DateTime dtGame;
    private DateTime dtReference;
    private System.Diagnostics.Stopwatch SW = new System.Diagnostics.Stopwatch();
    private double TimeRatio = (TimeSpan.FromDays(365).TotalMilliseconds / 4.0) / TimeSpan.FromMinutes(1).TotalMilliseconds;

    private void button1_Click(object sender, EventArgs e)
    {
        StartTime();
    }        

    private void StartTime()
    {
        dtReference = new DateTime(2013, 1, 1);
        SW.Restart();
        timer1.Start();
    }

    void timer1_Tick(object sender, EventArgs e)
    {
        UpdateTimes();
        DisplayTimes();
    }

    private void UpdateTimes()
    {
        double elapsed = (double)SW.ElapsedMilliseconds;
        dtReal = dtReference.AddMilliseconds(elapsed);
        dtGame = dtReference.AddMilliseconds(elapsed * TimeRatio);
    }

    private void DisplayTimes()
    {
        lblReference.Text = dtReference.ToString();
        lblReal.Text = dtReal.ToString();
        lblGame.Text = dtGame.ToString();
    }

}

编辑:添加了屏幕截图...

一分钟后=约3个月 Just after ONE minute = approx 3 months

在四分钟后=大约1年 Just after FOUR minutes = approx 1 year