一个更好的CDate VB6 [英] A better CDate for VB6
问题描述
我们有一个VB6应用程序(在COM组件中),它使用CDate()接受一个字符串并将其转换为一个Date,存储在数据库中。
We have a a VB6 app (in a COM component) which uses CDate() to take a string and cast it to a Date, for storing in a database.
根据我们是否希望应用程序以 dd / MM / yy 或 MM / dd / yy 进行通话,我们必须更改身份用户的区域设置为COM应用程序。 (现在,我们唯一的选择是 a讨厌的黑客。)
Depending on if we want the application to talk in dd/MM/yy or MM/dd/yy for example, we have to change the regional settings of the identity user for the COM application. (Right now the only option we have is a nasty hack.)
我们有一个日期格式字符串,用于格式化所有输出日期,并假设日期
We have a date format string which is used for formatting all output dates, and it is assumed that the date
如果这是.NET,我们将使用 DateTime.ParseExact ,并且笑了。为了这个唯一目的,调用以.NET编写的COM对象是一个选项。是否有一个不同的或更好的选项,涉及格式命令周围的一些黑魔法,或长期可重复使用的函数,根据格式字符串等标记日期。
If this were .NET we would use DateTime.ParseExact and be away laughing. Calling out to a COM object written in .NET for this sole purpose is an option. Is there a different or better option, involving some black magic around the Format command, or a long reusable function that tokenizes the date depending on the format string, etc?
推荐答案
这应该是接近的,虽然它将分隔符硬编码为/和Windows YY年50:
This should be close, though it hardcodes the delimiter as "/" and windows YY years at 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)。
Validation may not be perfect, but it ought to be close. It throws "Invalid procedure call or argument (Error 5)" on bad inputs.
这篇关于一个更好的CDate VB6的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!