微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

datetime – VB6的更好的CDate

我们有一个VB6应用程序(在COM组件中),它使用CDate()获取字符串并将其强制转换为Date,以存储在数据库中.

例如,根据我们是否希望应用程序以dd / MM / yy或MM / dd / yy进行通话,我们必须更改COM应用程序的标识用户的区域设置. (现在我们唯一的选择是a nasty hack.)

我们有一个日期格式字符串,用于格式化所有输出日期,并假定日期

如果这是.NET,我们将使用DateTime.ParseExact并且不要笑.为此唯一目的调用以.NET编写的COM对象是一种选择.是否有一个不同的或更好的选项,涉及Format命令周围的一些黑魔法,或一个长的可重用函数,根据格式字符串等标记日期?

这应该很接近,虽然它将分隔符硬编码为“/”并且窗口YY年份为50:
Private Function ParseDate(ByVal DateString As String,_
                           ByVal DatePattern As String) As Date
    'DateString:  i/j/k formatting.
    'DatePattern: i/j/k formatting,each to be:
    '               M or MM for month position.
    '               D or DD for day position.
    '               YY or YYYY for year position,if YY
    '                 then century windowed at 50.
    Dim strStringParts() As String
    Dim strPatternParts() As String
    Dim intPart As Integer,intscore As Integer
    Dim intMonth As Integer,intDay As Integer,intYear As Integer
    Const DELIM As String = "/"
    Const YYWINDOW As Integer = 50

    strStringParts = Split(DateString,DELIM)
    strPatternParts = Split(UCase$(DatePattern),DELIM)
    For intPart = 0 To UBound(strStringParts)
        If intPart > UBound(strPatternParts) Then
            Err.Raise 5,"ParseDate"
        End If
        Select Case strPatternParts(intPart)
            Case "M","MM"
                intMonth = CInt(strStringParts(intPart))
                intscore = intscore Or &H1
            Case "D","DD"
                intDay = CInt(strStringParts(intPart))
                intscore = intscore Or &H2
            Case "YY"
                intYear = CInt(strStringParts(intPart))
                If 0 > intYear Or intYear > 99 Then
                    Err.Raise 5,"ParseDate"
                End If
                intYear = intYear + IIf(intYear < YYWINDOW,2000,1900)
                intscore = intscore Or &H4
            Case "YYYY"
                intYear = CInt(strStringParts(intPart))
                If 100 > intYear Or intYear > 9999 Then
                    Err.Raise 5,"ParseDate"
                End If
                intscore = intscore Or &H4
            Case Else
                Err.Raise 5,"ParseDate"
        End Select
    Next
    If intscore = &H7 Then
        ParseDate = DateSerial(intYear,intMonth,intDay)
    Else
        Err.Raise 5,"ParseDate"
    End If
End Function

验证可能不完美,但它应该是接近的.它会在错误的输入上抛出“无效的过程调用或参数(错误5)”.

原文地址:https://www.jb51.cc/vb/255607.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐