2015-10-29 137 views
-2

嘗試將字符串轉換爲DateTime或TimeValue時出現問題。 我做了一個Windows窗體作爲例子。請看看這個看看錶:將字符串轉換爲DateTime或TimeValue

enter image description here

正如你可以看到有一個TextBox1中。 也是Timer1,間隔爲1000毫秒。

我想要的是能夠在文本框中填入一個時間(如此格式:22:30:00),當您的桌面到達此時,它將顯示一個消息框。

我嘗試了幾個舊帖子和教程與類似的問題,但我似乎無法找到解決方案。任何人都可以使用我的截圖做一個快速的例子嗎?

這是別人建議的代碼。

Dim tsValue As TimeSpan = TimeSpan.Zero 

If TimeSpan.TryParse(TextBox1.Text.Trim, tsValue) Then 
    If Date.Now.TimeOfDay = tsValue Then 
     MessageBox.Show(String.Format("Messagebox test {0}", tsValue.ToString)) 
    End If 
End If 

但由於某種原因,它不起作用時,我把它放在我的計時器。

+1

1)不要使用不相關的標籤2)不要在其他地方發佈圖片,發佈你已經嘗試**的代碼**這裏**請參閱[問] – Plutonix

+0

@Plutonix該OP沒有代表張貼到圖片,因爲它需要10個代表。 (否則,我同意你的評論)。 –

+0

@JordySteyaert - 未來,不要將代碼放在評論中,它不會格式化,而且很難閱讀。相反,編輯你的問題並在那裏添加它(就像我剛纔那樣)。 – Tim

回答

0

保留一個具有目標時間的變量(假設它通過了驗證)並讓您的計時器檢查目標時間是否與當前時間匹配。確保您的計時器更新日期發生變化的日期(上午12:00)。

Private m_dteTime As DateTime 
Private m_dteCurrentDate As Date = DateTime.Now.Date 

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged 

    'Validation 
    Try 
     Dim strHours As String = TextBox1.Text.Substring(0, 2) 
     Dim strMinutes As String = TextBox1.Text.Substring(3, 2) 
     Dim strSeconds As String = TextBox1.Text.Substring(6, 2) 

     If IsNumeric(strHours) AndAlso IsNumeric(strMinutes) And IsNumeric(strSeconds) Then 

      m_dteTime = DateTime.Now.Date.AddHours(Convert.ToDouble(strHours)).AddMinutes(strMinutes).AddSeconds(strSeconds) 

     Else 

      m_dteTime = DateTime.MinValue 

     End If 

    Catch ex As Exception 

    End Try 

End Sub 

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

    If DateTime.Now.Date > m_dteCurrentDate Then 

     m_dteCurrentDate = DateTime.Now.Date 

    End If 

    If m_dteTime.Date = DateTime.Now.Date AndAlso m_dteTime.Hour = DateTime.Now.Hour AndAlso _ 
     m_dteTime.Minute = DateTime.Now.Minute AndAlso m_dteTime.Second = DateTime.Now.Second Then 

     MsgBox("The time is now.") 

    End If 

End Sub 
+0

感謝您的回覆!我嘗試了你的代碼,但是當我填寫一個時間時,消息框沒有出現。我需要以什麼格式在文本框中輸入時間? HH:MM:SS? –

+0

完全像你的問題。確保您的計時器的間隔小於一秒。間隔250應該足夠了。 – N0Alias

+0

我把時間間隔改爲800,現在它的工作方式就像我想要的那樣。謝謝@NoAlias的幫助。每天學習新東西:) –

0

您的代碼不工作的原因是您使用「=」運算符來比較兩個極不可能相等的值。問題是,您在TextBox控件中輸入的時間值沒有毫秒,但TimeOfDay函數會返回包括毫秒的當前時間。因此,您的消息框永遠不會顯示。

現在,有很多方法可以解決這個問題,但讓我們保持簡單。如果將「=」更改爲「< =」,它將起作用,但在這種情況下,每個定時器迭代都會繼續顯示消息框,因此您必須在顯示消息框之後或之前禁用定時器。根據你想要達到的目標,這可能或不可能成爲你的解決方案。

如果您需要保持定時器運行,您可以在比較之前刪除當前時間的毫秒部分,這會讓您有一秒的時間進行比較。此外,在這種情況下,您應該將計時器間隔降低到較低的值(500ms應該足夠)。另外,如果我可能會建議,而不是TextBox,則應使用DateTimePicker控件,將Format屬性設置爲Time並將ShowUpDown屬性設置爲True。這將使您的生活更輕鬆,因爲它可以自動驗證並避免不必要的轉換。

+0

DateTimePicker的確會更好。如果你看看@NoAllias他的代碼,我將如何將TextBox1.Text.Substring(3,2)更改爲DateTimePicker的值? –

+0

你不知道。 DateTimePicker具有日期數據類型的Value屬性。這意味着,只需使用DateTimePicker1.Value.Minute即可提取分鐘部分,或者可以使用DateTimePicker1.Value.TimeOfDay將該值轉換爲TimeSpan,然後根據需要執行任何操作。 –

+0

感謝您的信息,將在我的項目上試用。一旦你學會如何使用它,聽起來很合理 –