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)”.

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...