在UI中显示日期和时间

时间:2016-03-10 06:08:35

标签: vb.net winforms timer

我的程序显示当前的日期和时间,并且必须准确,我需要阻止用户更改时间。这是我试过的。

在表单加载时,我查询服务器的当前日期和时间,并将本地系统时间更改为我得到的内容。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   cmd = New SqlCommand("Select getdate()", con)
   serverdatetime = cmd.ExecuteScalar
   Microsoft.VisualBasic.TimeOfDay = serverdatetime
   Microsoft.VisualBasic.DateAndTime.Today = serverdatetime
   TimeKeeper.Start()
End Sub

现在我尝试了两种显示时间的方法,第一种,因为我将系统时间调整为从服务器获得的时间,我只是从本地系统中获取时间。但是通过改变系统时间可以很容易地改变我的程序上的时间。

Private Sub TimeKeeper_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimeKeeper.Tick
    lblDate.Text = DateTime.Now.Date()
    lblTime.Text = DateTime.Now().ToString("HH:mm:ss")
End SUb

第二件事,我只是花时间从服务器获取并每秒递增一次。

Private Sub TimeKeeper_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimeKeeper.Tick
    serverdatetime = serverdatetime.AddSeconds(1)
    lblDate.Text = serverdatetime.Date()
    lblTime.Text = serverdatetime.ToString("HH:mm:ss")
End SUb

我觉得它工作得很好,但是一旦我在系统中执行一些操作似乎就会延迟(我猜是因为其他一些代码正在运行,我的计时器没有执行它的代码)而且我做得越多它得到的就越多延迟,经过一些程序测试后,服务器时间比我在程序中的时间提前了10秒。

那么,我怎样才能实现我的需要呢?

1 个答案:

答案 0 :(得分:0)

您不能依赖Timer的Tick事件。我将使用StopWatch类来获取持续时间(因为读取服务器时间时),与系统时间调整无关。

Dim stopWatch As StopWatch = new StopWatch()
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   cmd = New SqlCommand("Select getdate()", con)
   serverdatetime = cmd.ExecuteScalar
   stopWatch.Start()
   TimeKeeper.Start()
End Sub

Private Sub TimeKeeper_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimeKeeper.Tick
    Dim currentDate As DateTime = serverdatetime.Add(stopWatch.Elapsed)      
    lblDate.Text = currentDate.Date()
    lblTime.Text = currentDate.ToString("HH:mm:ss")
End SUb