将芬兰语日期字符串解析为VB6中的日期类型

时间:2011-09-13 08:53:13

标签: parsing datetime vb6 casting

我收到的芬兰日期字符串如下:

29.7.2011 9:27

我正在尝试将此字符串转换为VB6中的Date对象。我已经尝试过使用Format函数,但它似乎没有吞下日期字符串或者我做错了什么。这些是我尝试过的一些方法:

theDate = Format(dateString, "General Date")

theDate = Format(dateString, "DD.MM.YYYY MM:HH")

有什么想法吗?感谢。

4 个答案:

答案 0 :(得分:2)

芬兰系统应该能够使用CDate()正确解析这些问题。如果您在非芬兰语系统上解析它并且格式已修复,那么您需要将其拆分为代码:

Dim Parts() as string, dateParts() As String, timeParts() as string
parts = Split(dateString, " ")
dateParts = Split(parts(0), ".") 
timeParts = Split(parts(1), ":")
theDate = DateSerial(dateParts(2), dateParts(1), dateParts(0)) + TimeSerial(timeParts(0), timeParts(1), 0)

你可能会想要添加错误处理和健全性检查,但这是基本的想法。

请注意,将字符串值转换为字符串值和从字符串值转换日期将是容易出错的,除非使用非常明确的agreed formats ISO 8601 RFC 822日期和{i 3} {i 3}}标准。

答案 1 :(得分:2)

您可以通过以下方式使用DateSerial和'TimeSerial'

dateString = "29.7.2011 9:27"

Dim theDate as Date

dim yyyy as Integer
dim mm as Integer
dim dd as Integer
dim hh as integer
dim mm as integer

yyyy = mid(dateString,6,4)
mm = mid(dateString,4,1)
dd = mid(dateString,1,2)
hh = mid(dateString,11,1)
mm = mid(dateString,13,2)

theDate = DateSerial(yyyy,mm,dd) + TimeSerial(hh,mm,0)

现在你theDate是一个Date对象,可以按照你想要的方式进行格式化

MsgBox Format(theDate,"yyyy-MMM-dd")  'This will display the a message with 2011-Jul-29

如果你的日期字符串没有用零填充(例如:2.4.2011而不是02.04.2011),那么你需要遍历字符串以找到你需要的日期的位和部分。 / p>

答案 2 :(得分:2)

而不是自己手动解析字符串,这很容易出错,如果你必须处理多种日期格式会变得混乱,你可以调用OLE自动化库(VB6内部用于很多东西,包括类型转换)为您进行转换。它可以将Windows支持的任何日期/时间格式的字符串转换回原始日期

  

完全披露:我同意Deanna's answer中的观点:一般来说,您应该尝试使用明确的日期/时间   转换日期与字符串之间的格式,但如果你不能这样做   出于某种原因,这里概述的解决方案应该相当健壮,只要您提前知道传入日期字符串将采用何种特定格式。

以下是 DateFromString 函数的示例,该函数在内部使用VarDateFromStr函数将格式化日期/时间字符串转换为日期< /强>

使用示例

将芬兰日期字符串转换为日期并显示它:

MsgBox DateFromString("29.7.2011 9:27", fl_FI)

在我的机器上(美国英语设置),显示“7/29/2011 9:27 AM”,这是正确的日期和时间(7月29日)。

<强>代码

将下面的代码放入项目中的新模块(.bas文件)中以使用它。该代码目前支持解析美国英语( en_US )和芬兰语( fl_FI )日期字符串,但如果需要,您可以添加对更多语言环境的支持。有关区域设置ID的完整列表,请参阅 Locale IDs assigned by Microsoft


Option Explicit

Public Enum LocaleIDs
    en_US = &H409       ' English (United States)
    fl_FI = &H40B       ' Finnish
    ' [[ Add other Locale ID's here as needed ]] '
End Enum

Private Declare Function VarDateFromStr Lib "oleaut32.dll" ( _
    ByVal psDateIn As Long, _
    ByVal lcid As Long, _
    ByVal uwFlags As Long, _
    ByRef dtOut As Date) As Long

Private Const S_OK = 0
Private Const DISP_E_BADVARTYPE = &H80020008
Private Const DISP_E_OVERFLOW = &H8002000A
Private Const DISP_E_TYPEMISMATCH = &H80020005
Private Const E_INVALIDARG = &H80070057
Private Const E_OUTOFMEMORY = &H8007000E

'
' Converts a date string in the specified locale to a VB6 Date.
'
' Example:
'
'   Convert a Finnish date string as follows:
'
'   DateFromString("29.7.2011 9:27", fl_FI)
'
Public Function DateFromString(ByVal sDateIn As String, ByVal lcid As LocaleIDs) As Date

    Dim hResult As Long
    Dim dtOut As Date

    ' Do not want user's own settings to override the standard formatting settings
    ' if they are using the same locale that we are converting from.
    '
    Const LOCALE_NOUSEROVERRIDE = &H80000000

    ' Do the conversion
    hResult = VarDateFromStr(StrPtr(sDateIn), lcid, LOCALE_NOUSEROVERRIDE, dtOut)

    ' Check return value to catch any errors.
    '
    ' Can change the code below to return standard VB6 error codes instead
    ' (i.e. DISP_E_TYPEMISMATCH = "Type Mismatch" = error code 13)
    '
    Select Case hResult

        Case S_OK:
            DateFromString = dtOut
        Case DISP_E_BADVARTYPE:
            Err.Raise 5, , "DateFromString: DISP_E_BADVARTYPE"
        Case DISP_E_OVERFLOW:
            Err.Raise 5, , "DateFromString: DISP_E_OVERFLOW"
        Case DISP_E_TYPEMISMATCH:
            Err.Raise 5, , "DateFromString: DISP_E_TYPEMISMATCH"
        Case E_INVALIDARG:
            Err.Raise 5, , "DateFromString: E_INVALIDARG"
        Case E_OUTOFMEMORY:
            Err.Raise 5, , "DateFromString: E_OUTOFMEMORY"
        Case Else
            Err.Raise 5, , "DateFromString: Unknown error code returned from VarDateFromStr (0x" & Hex(hResult) & ")"
    End Select

End Function

答案 3 :(得分:1)

解析充其量是混乱的,但这是一个较短的样本如何做到

Private Sub Command1_Click()
    MsgBox Format$(TryParse("29.7.2011 9:27"), "yyyymmdd hh:mm:ss")
End Sub

Private Function TryParse(sFinnishDate As String) As Date
    Dim vSplit As Variant

    vSplit = Split(Replace(Replace(sFinnishDate, ".", " "), ":", " "))
    On Error Resume Next
    TryParse = DateSerial(vSplit(2), vSplit(1), vSplit(0)) + TimeSerial(vSplit(3), vSplit(4), 0)
    On Error GoTo 0
End Function