自定义计时器和时差

Custom chronometer and time difference

我是 C# 的新手,我正在尝试制作一个自定义计时器,它由两个显示时间字符串(时间和 time0/time1)的标签(label1 和 label2)和一个按钮(pause/play) 每次点击都会将其文本从暂停更改为播放,反之亦然。 Label1 显示时间,它是由 datetime.now (hhmmss) 制作的字符串变量,label2 显示时间 0,在单击按钮 "pause" 并再次单击 "play" 后,它将显示时间 1(计算时间 1通过下面的公式)。

它执行以下操作:

  1. 获取系统datetime.now (hhmmss),将其保存在time字符串中并显示在label1
  2. 按下按钮暂停,将 time 的值保存在另一个字符串 time0 中,并在 label2
  3. 中显示停止
  4. 按下按钮播放,开始label2的时间(time1)与label1的时间不同步

要计算 time1 我想使用这个公式:

time1 = DateTime.Now - ((difference between DateTime.Now and time0) - 1 second)

我卡在了第三点,因为我不知道如何计算两个字符串之间的时间差以及如何使用新时间 time1 作为 label2 和 next 的文本点击次数。

这是我的实际代码,如果能帮助完成它,我将不胜感激,谢谢。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        //time0
        public int hh = 0;
        public int mm = 0;
        public int ss = 0;

        //time
        public string time = "";
        public string time0 = ""; 

        public bool IsPause = true;

        public Timer t = new Timer();

        public Form1()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //timer interval
            t.Interval = 1000;  //in millisecondi

            t.Tick += new EventHandler(this.t_Tick);

            //start timer form loads
            t.Start();  //questo userà il metodo t_Tick()
        }

        //timer eventhandler
        private void t_Tick(object sender, EventArgs e) 
        { 
            //get current time
            hh = DateTime.Now.Hour;
            mm = DateTime.Now.Minute;
            ss = DateTime.Now.Second;

            //padding leading zero
            if(hh < 10)
            {
                time += "0" + hh;
            }
            else
            {
                time += hh;
            }       
            time += ":";

            if(mm < 10)
            {
                time += "0" + mm;
            }
            else
            {
                time += mm;
            }
            time += ":";

            if (ss < 10)
            {
                time += "0" + ss;
            }
            else
            {
                time += ss;
            }

            //update labels
            label1.Text = time;
            if (IsPause == false) label2.Text = time0;
            else label2.Text = time;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "pause")
            {
                IsPause = false;
                button1.Text = "play"; 
                time0 = label1.Text;                           
            }
            else
            {
                IsPause = true;
                button1.Text = "pause";              
            }
        }
    }
}

听起来好像您最好将时间保存在控件中以及将时间保存为字符串。标签 属性 就是为此目的而存在的。参见 https://msdn.microsoft.com/en-us/library/system.windows.forms.control.tag%28v=vs.110%29.aspx

因此,例如,如果您将在 label2.Tag 中使用的 DateTime 设置为与在 label2.Text 中将其格式化为文本的时间相同,那么您可以将其称为 DateTime。然后当你需要从中计算时,你可以使用

DateTime.Subtract - 参见 https://msdn.microsoft.com/en-us/library/8ysw4sby%28v=vs.110%29.aspx

确定经过的时间。

因此,要将此引用到您的代码中,只要您有这样的代码,其中时间是您从 DateTime 实例创建的字符串:

label1.Text = time;

你还需要像这样设置时间(DateTime.Now是一个例子,你应该选择你用来格式化时间字符串的任何东西):

label1.Tag = DateTime.Now

然后,当你想知道 label1 中的时间时,这样做:

DateTime t = (DateTime)label1.Tag