我的程序显示当前的日期和时间,并且必须准确,我需要阻止用户更改时间。这是我试过的。
在表单加载时,我查询服务器的当前日期和时间,并将本地系统时间更改为我得到的内容。
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秒。
那么,我怎样才能实现我的需要呢?
答案 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