[英]VB.NET TryParse returns False although a valid date passed
我在VB.NET中创建了一个用于检查有效日期的函数。 该功能如下:
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
我向该函数传递了一个我认为是有效日期的值。 我的测试值为49278,应对应于2034年11月30日。
但是我的函数告诉我这不是一个有效的日期。 我不明白为什么。
这是怎么回事
那是一个Double
,它不能通过DateTime.Parse
解析为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
该值是Excel等使用的“ OLE自动化日期”。
DateTime.Parse
需要一个字符串表示形式的日期,例如12th Nov 2034
或3/5/14
并且默认情况下使用其所运行的线程上下文的区域性信息进行解析。
在您的情况下,我认为您应该先检查该值是否为Double,然后使用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
注意:不需要在Object声明两边加上方括号。
也许要改善这一点,您应该有一个重载的方法,其中一个方法接受一个double值,一个接受一个字符串,那么使用double值调用它时,就没有装箱和拆箱值类型的开销
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
更好的是-创建上述扩展方法,然后可以执行类似49278R.IsDate
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.