秒表计算(转换00:00)为00:00

Stop watch calculation (convert 00:00) to 00:00

我遇到了一个小问题,它是一个简单的秒表,但我想在每次程序关闭或单击停止时保存最后日期,以计算每次单击开始的时间,直到我停止制造之类的东西时间.

举个例子:如果我今天点击开始5秒,然后我关闭程序,我想节省5秒。

然后当我重新打开程序时,它从零开始但求和 5 秒。

如果我点击开始8秒,它将变成:

如果我关闭程序并重新打开它并单击开始 7 秒

但我一直将其转换为 ("HH:mm: ss")

变成那样

00:00:00 converts to 2/23/2020 12:00:00 AM.

我希望它转换为 00:00:00 没有任何日期(月、年...)

因为当我求和时它给了我错误的数字。

System.Timers.Timer t;
int D, H, m, s;
CultureInfo enUS = new CultureInfo("en-US");
DateTime Drawing;
DateTime Rent;
long Machine_time;

public Form1()
{
        InitializeComponent();
        Rent = Properties.Settings.Default.Drawing_Time;
}

private void Start_Click(object sender, EventArgs e)
{
        t.Start();
}

private void Stop_Click(object sender, EventArgs e)
{
        t.Stop();

        try
        {
            // Drawing = DateTime.ParseExact(textBox1.Text, @"HH:mm:ss", CultureInfo.InvariantCulture);
            Drawing = DateTime.Parse(textBox1.Text);
          //  Drawing = DateTime.Now.ToString( @"HH:mm:ss");
            Console.WriteLine("{0} converts to {1}.", textBox1.Text, Drawing.ToString());
        }
        catch (FormatException)
        {
            Console.WriteLine("{0} is not in the correct format.", textBox1.Text);
        }

        Properties.Settings.Default.Drawing_Time = Drawing;

        long elapsedTicks = Drawing.Ticks ;
        Machine_time = elapsedTicks + Machine_time;
        TimeSpan elapsedSpan = new TimeSpan(Machine_time);
        MessageBox.Show(Drawing.ToString());

        string message = elapsedSpan.ToString();
        MessageBox.Show(message);

        saveSettings();
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
       Properties.Settings.Default.Machine_Time = Machine_Time ;

        saveSettings();
        t.Stop();
        Application.DoEvents();
    }

    public void saveSettings()
    {
        try
        {
            Properties.Settings.Default.Save();
            MessageBox.Show("Saved Settings");
        }
        catch (Exception e)
        {
            MessageBox.Show("Save Settings: " + e);
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        t = new System.Timers.Timer();
        t.Interval = 1000;
        t.Elapsed += onTimeEvent;
    }

    private void onTimeEvent(object sender, System.Timers.ElapsedEventArgs e)
    {
        Invoke(new Action(() =>
        { 
            s += 1;

            if (s == 60)
            {
                s = 0;
                m += 1;
            }

            if (m == 60)
            {
                m = 0;
                H += 1;
            }

            if (H == 24)
            {
                H = 0;
                D += 1;
            }

            labelResult.Text = string.Format("{0}:{1}:{2}:{3}", D.ToString().PadLeft(2, '0'), H.ToString().PadLeft(2, '0'), m.ToString().PadLeft(2, '0'), s.ToString().PadLeft(2, '0'));
            textBox1.Text= string.Format("{0}:{1}:{2}",  H.ToString().PadLeft(2, '0'), m.ToString().PadLeft(2, '0'), s.ToString().PadLeft(2, '0'));
        }));
}

我看到您正在使用 DateTime 来保持 "accumulated time" 或已经过去了多少时间。不要为此使用 DateTime。顾名思义,DateTime 用于保留 DATE 和 TIME 部分,当您认为 "how much time has passed since 5 days ago?" 时,您不会用“5 月 5 日”回答此类问题。你需要一些不关心日历日期的东西。只是时间本身。

您要使用的是 TimeSpan,这是一个 间隔 的时间,没有日期。这种数据类型简单地描述了经过了多少时间。你不会在那里找到“2 月 13 日”,因为月-日用于描述时间点,而不是时间间隔。在 TimeSpan 中,时间间隔被描述为 seconds/minutes/hours/days,嗯,就是这样。 year/month 的长度因各种因素而异,因此它不是一个好的时间间隔单位。有人可能会争辩说 "a week" 总是 7 天,好吧,我们也可以使用它,但是 TimeSpan 没有周。 dayTimeSpan 中的最后一个单元。

稍微玩一下 TimeSpan,您很可能会自己解决所有问题,并从编码中获得更多乐趣。

哦,你可能还想注意到你可以减去DateTime。一个日期时间减去另一个日期时间 returns 你一个 TimeSpan 值。好用。

你的尝试是一个相当复杂的程序,就其本身而言,它似乎是.. 只使用日期时间会更简单:

private DateTime _startTime = DateTime.MinValue;

public Form1()
{
        InitializeComponent();
}

private void Start_Click(object sender, EventArgs e)
{
        _startTime = DateTime.UtcNow;
}

private void Stop_Click(object sender, EventArgs e)
{
        StopStopwatch(true);
}

private void StopStopwatch(bool showErrorMessages)
{
        if(_startTime > DateTime.MinValue)
            Properties.Settings.Default.ElapsedTotalSeconds += (DateTime.UtcNow - _startTIme).TotalSeconds;
        else if(showErrormessages)
            MessageBox.Show("Stopwatch isn't running");

        _startTIme = DateTime.MinValue; //if minvalue it means the stopwatch isn't running
}

private void Reset_Click(object sender, EventArgs e)
{
        Properties.Settings.Default.ElapsedTotalSeconds = 0;
}        


private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
        StopStopwatch(false);
        Properties.Settings.Default.Save();
}


//if you want a visual feedback the timer is running, have a timer that you start and stop with the click events, and update a label in its tick event
private void Timer_Tick(...) //its a windows forms timer, not a system timers timer
{
        if(_startTIme > DateTime.MinValue){

          TimeSpan ts = TimeSpan.FromSeconds(Properties.Settings.Default.ElapsedTotalSeconds);

          ts += (DateTime.UtcNow - _startTime);

          Label1.Text = ts.ToString();

        }
}

这就是您需要管理的所有细节:

  • 记录有人点击开始的时间

  • 当有人点击停止时,将当前时间减去开始时间,然后从结果时间跨度中得到总秒数。将秒表标记为非 运行,因此如果他们再次单击停止,它不会再次添加

  • 将那些秒数存入设置保存(注意:必须是用户范围设置,应该是double类型)

  • 如果他们在定时器 运行 时退出应用程序,停止定时器,添加秒数,保存设置,关闭应用程序

提供重置机制。

如果您想要某种视觉反馈,计时器是 运行,请参阅代码底部 - 这是一个计时器,它会根据基于设置值,加上基于单击开始时间和现在之间的差异的 TimeSpan。每次计时器响起时,标签都会更新。如果你想让 tit 每秒更新 10 次,将定时器间隔设置为 100ms

感谢指导我的人是的,我只是将 DateTime 替换为 TimeSpane,但是是的,它有一个星期的限制,但我可以弄清楚。再次感谢

和这个修改代码

  private void Stop_Click(object sender, EventArgs e)
    {
        t.Stop();
          try
        {
            Drawing_time =  TimeSpan.Parse (labelResult.Text);
            Console.WriteLine("{0} converts to {1}.", labelResult.Text, Drawing_time.ToString());
        }
        catch (FormatException)
        {
            Console.WriteLine("{0} is not in the correct format.", labelResult.Text);
        }
         Machine_time = Drawing_time + Machine_time;
        Properties.Settings.Default.Machine_Time = Machine_time;
       MessageBox.Show(Drawing_time.ToString());
        string message = "Full Time   " + ((Machine_time)).ToString() + "\n" +"Days   " +((Machine_time.Days)).ToString() + "\n" + "Hours   "+((Machine_time.Hours)).ToString() + "\n"
         + "Minutes  " + ((Machine_time.Minutes)).ToString()+ "\n"+ "Seconds  " + ((Machine_time.Seconds)).ToString();
     MessageBox.Show(message);
        saveSettings();
    }