繁体   English   中英

VB.NET TryParse返回False,尽管经过了有效日期

[英]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 20343/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM