2017-10-05 16 views
-1

我從文件中讀取了此字符串:23/07/1998。這是一個完全有效的日期字符串。它沒有含糊之處,因爲這些數字(似乎)只是解析它的一種可能的方式。DateTime.TryParse對於完美有效的日期無效

DateTime.TryParse另一方面,告訴我它是無效的。我懷疑這是由於我的文化背景。

TryParse具有相當複雜的變化,所以我想知道是否有一種簡單的方法來解析「dd/MM/yyyy」?

回答

1
Dim iString As String = "01/12/1998" 
Dim oDate As DateTime = DateTime.ParseExact(iString, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture) 
MsgBox(oDate.ToString()) 
+0

很煩人的語法!但它的工作。 –

+0

@MauryMarkowitz請將其標記爲將其從未解答的問題隊列中移出的答案 –

+3

雖然這可能會回答他的問題,但最好包含關於導致問題的原因以及您的答案爲何解決問題的說明(即,什麼是'Parse'和'ParseExact'之間的區別)。 _「僅限代碼」_-答案通常只會被忽視,因爲它們通常只會有助於解決問題,而不會教授任何OP或其他讀者。 –

4

TryParse不知道您的日期是MM/dd/yyyy還是dd/MM/yyyy。這對觀察者來說是顯而易見的,因爲我們可以從事實上推斷出沒有23個月的事實,但它不知道02/03/1998是什麼。

DateTime.ParseExact(dateString, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture) 

會告訴它要使用哪種格式。

+1

簡明扼要的答案,非常好的解釋! +1 - **注意OP:**這兩個答案都提到了'ParseExact()',但也有[**'TryParseExact()'**](https://msdn.microsoft.com/ en-us/library/ms131044(v = vs.110).aspx)(儘管它有更令人討厭的語法;) –

+0

奇怪的是,這個調用的macOS/Unix/Linux版本處理這個問題時沒有指定格式。它還處理諸如「明天」和「下個週二」等事情。看到.net版本比較簡單,因爲它的凍結日期大概是二十年後的樣子。 –

0

像已經mentioned by dwilliss常規DateTime.TryParse()方法不能dd/MMMM/dd區分,只有在一組標準的日期時間格式進行操作。要指定一個不同的格式,兼用DateTime.ParseExact()DateTime.TryParseExact()

如果你想要一個更討人喜歡語法,你可以創建一個extension method包裹DateTime.TryParseExact() method

Imports System.Globalization 
Imports System.Runtime.CompilerServices 

Public Module Extensions 
    <Extension()> _ 
    Public Function TryParseDate(ByVal Input As String, ByVal Format As String, <Out()> ByRef Result As DateTime) As Boolean 
     Return DateTime.TryParseExact(Input, Format, CultureInfo.InvariantCulture, DateTimeStyles.None, Result) 
    End Function 
End Module 

現在你可以使用這樣的:

Dim DateString As String = "23/07/1998" 
Dim ResultDate As DateTime = Nothing 

If DateString.TryParseDate("dd/MM/yyyy", ResultDate) Then 
    MessageBox.Show("Success: " & ResultDate.ToString()) 
Else 
    MessageBox.Show("Input was not a valid date!") 
End If