2012-05-06 41 views
-1

我用一個DateTimePicker選擇一個日期時間值,看看我有多少時間,直到它是零:我在VB.NET計時器丟失一個第二

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 

timeInSeconds = (DateTimePicker1.Value.Subtract(System.DateTime.Now)).ToString 
       'RichTextBox1.Text = RichTextBox1.Text + vbTab + timeInSeconds.ToString 
       timeInSeconds = timeInSeconds.Substring(0, timeInSeconds.LastIndexOf(".")) 

End Sub 

以上RichTextBox的顯示,我鬆了第二在約各30秒時:

23:59:47.4060217 
23:59:46.3939638 
23:59:45.3799058 
23:59:44.3648477 
23:59:43.3517898 
23:59:42.3377318 
23:59:41.3236738 
23:59:40.3096158 
23:59:39.2955578 
23:59:38.2814998 
23:59:37.2674418 
23:59:36.2533838 
23:59:35.2393258 
23:59:34.2242677 
23:59:33.2112098 
23:59:32.1981518 
23:59:31.1830938 
23:59:30.1690358 
23:59:29.1549778 
23:59:28.1409198 
23:59:27.1268618 
23:59:26.1128038 
23:59:25.0997458 
23:59:24.0856878 
23:59:23.0716298 
23:59:22.0575718 
23:59:21.0435138 
23:59:20.0284558 
23:59:19.0143978 
**23:59:18.0013398 
23:59:16.9872818** 

所以使用

timeInSeconds = timeInSeconds.Substring(0, timeInSeconds.LastIndexOf(".")) 

不言而喻從二十三時59分18秒到23時59分十六秒

這是爲什麼?我做錯了什麼? 是時候

(DateTimePicker1.Value.Subtract(System.DateTime.Now)).ToString 

發生了我失去了什麼?

定時器設置爲每秒更改一次。

如何才能獲得正確的結果?

在此先感謝!

+3

計時器沒有1秒的分辨率。你不能保證那種精確度。 –

+0

如果你需要在計算中小數,每一步之間的差異幾乎是一樣的:1.013 ...秒,這將解釋從18.001的飛躍......到16.987 ... – Koen

+0

嗯,23:59:18.0013398 - 23:59:16.9872818是第二個。如果您想更好地保證查看所有數字,請使計時器在小於一秒鐘內打勾。 –

回答

0

嘗試不直接附加文本,而是將結果連接到tmp字符串中。 之後,將tmp分配給textbox1.text。

我一直在一個情況下,我必須修改文本每for循環迭代,以顯示十六進制的一個字節,結果是令人印象深刻,當我轉移到以往的研究方法。

試試看吧。

從評論:

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick 
    Dim timeInSeconds = (DateTimePicker1.Value.Subtract(System.DateTime.Now)).ToString 
    'RichTextBox1.Text = RichTextBox1.Text + vbTab + timeInSeconds.ToString 
    timeInSeconds = timeInSeconds.Substring(0, timeInSeconds.LastIndexOf(".")) 
    TextBox1.Text &= timeInSeconds & vbNewLine 
End Sub 

我在1000毫秒爲單位計時測試此代碼,並沒有任何問題。

+0

您的意思是在代碼中是這樣的:timeInSeconds = timeInSeconds.Substring(0,timeInSeconds.LastIndexOf(「 。「)) Dim tmp As String = timeInSeconds TextBox5.Text = tmp? – Novemberland

+0

它不完全,當計時器停止將tmp字符串分配給textbox1.text(tmp必須是全局的) – sarepta

+0

我希望在計時器停止之前得到正確的結果。你能用上面問題中使用的代碼顯示更多細節嗎?提前致謝! – Novemberland

0

準確度根據您正在做的事情以及同時發生的其他事情發生變化。您可以通過每次重置間隔來進行更正。現在,當你正在做的任務超過一秒鐘時,就會發生故障,但它會使蜱蟲發生在儘可能接近第二的位置。

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick 
    Timer1.Enabled = False 

    'do your stuff here 

    Timer1.Interval = 1000 - Date.Now.Millisecond 
    Timer1.Enabled = True 

    End Sub 

我通常在每分鐘或每小時都想要發生某些事情時使用這種技術。

+0

我試過了,它顯示出這些錯誤的結果:23:58:39.9951079; 23:58:38.9990509; 23:58:38.0049941; 23:58:38.9990509 – Novemberland

+0

我的猜測是你沒有禁止輸入Tick事件的計時器。 –

+0

@ Robert Beaubien:你是對的,我沒有在進入Tick事件時禁用計時器,但是我這樣做了,結果更糟糕:23:59:41.9921606; 23:59:40.9931035; 23:59:40.0010467我還在編輯器上寫錯了什麼嗎?感謝您的關注! – Novemberland

相關問題