VB.NET TryParse返回False,虽然有效的date通过

我在VB.NET中创build了一个检查有效date的函数。 function如下:

Public Shared Function IsDate(obj As [Object]) As Boolean Dim strDate As String = obj.ToString() Dim dt As DateTime = DateTime.MinValue If DateTime.TryParse(strDate, dt) AndAlso dt <> DateTime.MinValue AndAlso dt <> DateTime.MaxValue Then Return True Else Return False End If End Function 

我将一个值传递给我认为是有效date的函数。 我的testing值是49278,应该对应于2034年11月30日的date。

然而我的function告诉这不是一个有效的date。 我不明白为什么。

在这里输入图像说明

这里发生了什么?

该值是由Excel等使用的“OLE自动化date”

DateTime.Parse需要像date12th Nov 20343/5/14这样的date的string表示,并且默认情况下使用它正在运行的线程上下文的区域性信息进行分析。

在你的情况下,我认为你应该检查是否值是一个双DateTime.FromOADate ,然后使用DateTime.FromOADate如果是:

 Public Shared Function IsDate(obj As Object) As Boolean Dim dt As DateTime Dim d As Double Dim strDate As String = obj.ToString() If Double.TryParse(strDate, d) Then dt = DateTime.FromOADate(d) 'parsed OA date ElseIf DateTime.TryParse(strDate, dt) Then 'parsed string representation of date Else dt = DateTime.MinValue End If Return (Not dt = DateTime.MinValue AndAlso Not dt = DateTime.MaxValue) End Function 

注意:对象声明的四边括号不需要。

也许要改善这个你应该有一个接受一个double和一个string的重载的方法,那么你没有装箱和取消装箱价值types的开销,当调用它使用双值

 Public Shared Function IsDate(d As Double) As Boolean Dim dt As DateTime = DateTime.MinValue Try dt = DateTime.FromOADate(d) Return (Not dt = DateTime.MinValue AndAlso Not dt = DateTime.MaxValue) Catch ex As Exception Return False End Try End Function Public Shared Function IsDate(s As String) As Boolean Dim dt As DateTime If DateTime.TryParse(s, dt) Then Return True Else Return False End If End Function 

更好 – 创build上述的扩展方法,然后你可以做这样的事情49278R.IsDate

这是Double ,它不能通过DateTime.Parseparsing为Date ,使用DateTime.FromOADate

 Public Shared Function IsDate(obj As Object) As Boolean If obj Is Nothing Then Return False Dim dt As DateTime If TypeOf obj Is DateTime Then dt = DirectCast(obj, DateTime) Else Dim strDate As String = obj.ToString() If Not DateTime.TryParse(strDate, dt) Then Dim oaVal As Double If Double.TryParse(strDate, oaVal) Then Try dt = DateTime.FromOADate(oaVal) Catch ex As ArgumentException Return False End Try End If End If End If Return dt <> DateTime.MinValue AndAlso dt <> DateTime.MaxValue End Function