定制天文台和时差

时间:2015-02-09 11:14:21

标签: c# datetime clock chronometer system-clock

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

它执行以下操作:

  1. 获取系统datetime.now(hhmmss),将其保存在时间字符串中并在label1中显示
  2. 按下按钮暂停,将时间的值保存在另一个字符串 time0 中,并将其显示在label2中停止
  3. 按下按钮播放,开始标签2的时间(时间1 ),该时间与label1的时间不同步
  4. 要计算 time1 ,我想使用此公式:

      

    time1 = DateTime.Now - ((DateTime.Now和 time0 之间的差异) - 1秒)

    我坚持第3点,因为我不知道如何处理两个字符串之间的时差,并使用新的时间 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";              
                }
            }
        }
    }
    

1 个答案:

答案 0 :(得分:1)

听起来好像你最好节省控件中的时间以及作为字符串的时间。 Tag属性就是为此目的。见https://msdn.microsoft.com/en-us/library/system.windows.forms.control.tag%28v=vs.110%29.aspx

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

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

确定经过的时间。

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

label1.Text = time;

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

label1.Tag = DateTime.Now

然后,如果您想知道label1中的时间,请执行以下操作:

DateTime t = (DateTime)label1.Tag