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 2034
或3/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.Parse
parsing为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