0

所以我有一个字段,数据类型是输入数据库的文本。它返回的内容大致如下:

ddd MMM dd hh:mm:ss yyyy

我想要它做的是显示为这样的东西:

ddd MMM dd yyyy hh:mm:ss

我可以通过使用如下所示的 Format() 来实现这一点:

Format(alarmdet.AlarmStart, "ddd MMM dd yyyy hh:mm:ss) AS AlarmDateTime

但是,这一切都很好。我希望能够将此值转换为日期时间。我试过使用 CVDate、CDate、DateValue,每次我收到一个错误,声称数据类型不匹配。我将如何将这个确切的字符串转换为日期时间?

笔记:

所以你知道,我能够在英语(美国)语言环境中成功转换,但我正试图让它在葡萄牙语(葡萄牙)语言环境中工作。在这个语言环境中,我得到了不匹配的数据类型错误,我认为这与访问如何读取缩写月份有关。我是否缺少一些东西来使它在国际环境中成功运作?

我也想在不同的字段中转换类似的东西,让它看起来像这样:

月/日/年

我再次知道我可以使用 Format() 来获取它,但我想将其转换为 DateTime。我该怎么做呢?

非常感谢任何帮助或建议。

谢谢。

4

3 回答 3

2

在我看来,第一个挑战是将您的自定义字符串读取为有效日期。在上一个问题中,您将其作为存储在 [AlarmStart] 字段中的示例字符串提供:

Tue Jan 18 10:10:57 2011

问题是 VBA 无法将该字符串识别为包含有效的日期/时间值。

? IsDate("Tue Jan 18 10:10:57 2011")
False

但是,如果您修改该字符串(删除一周中的某一天并提前一年移动),您可以生成一个 VBA 识别为有效日期的字符串。

? IsDate("Jan 18 2011 10:10:57")
True

因此,您可以使用函数来拆分字符串,重新排列所需的部分,并返回日期/时间值。

Public Function DateFromCustomString(ByVal pIn As String) As Variant
    Dim varPieces As Variant
    Dim strNew As String
    Dim varReturn As Variant

    varPieces = Split(pIn)
    strNew = Join(Array(varPieces(1), varPieces(2), varPieces(4), _
        varPieces(3)), " ")
    If IsDate(strNew) Then
        varReturn = CDate(strNew)
    Else
        varReturn = Null
    End If
    DateFromCustomString = varReturn
End Function

(从 Access 2000 开始可以使用 Split() 和 Join() 函数。)

而且,一旦您从字符串中获得了日期/时间值,您就可以使用 Format() 函数来随意显示它。

Format(DateFromCustomString(alarmdet.AlarmStart), "ddd MMM dd yyyy hh:mm:ss") AS AlarmDateTime
Format(DateFromCustomString(alarmdet.AlarmStart), "mm/dd/yyyy") AS AlarmDate

这如使用英文月份名称缩写所描述的那样工作。我不知道葡萄牙语会发生什么。

于 2011-08-31T22:32:35.803 回答
0

无论您的语言环境如何,您都可以使用字典对象将英文月份缩写转换为数字。下面的函数会将您上面列出的格式转换为有效的日期/时间。您可能想要编写一个更好的错误处理程序。

Public Function textToDate(text As String) As Date
    Dim months As Object
    Dim year As String
    Dim month As String
    Dim day As String
    Dim time As Date

    On Error GoTo eh

    text = Trim(text)

    Set months = CreateObject("Scripting.Dictionary")
    months.Add "Jan", 1
    months.Add "Feb", 2
    months.Add "Mar", 3
    months.Add "Apr", 4
    months.Add "May", 5
    months.Add "Jun", 6
    months.Add "Jul", 7
    months.Add "Aug", 8
    months.Add "Sep", 9
    months.Add "Oct", 10
    months.Add "Nov", 11
    months.Add "Dec", 12

    year = Right(text, 4)
    month = months(Mid(text, 5, 3))
    day = Mid(text, 9, 2)
    time = CDate(Mid(text, 12, 8))

    textToDate = CDate(DateSerial(year, month, day) + time)
Exit Function
eh:
    textToDate = #1/1/1900#
End Function

编辑: 如果您最终使用此解决方案,请使用 HansUp 的 Split() 方法而不是我的 mid(); 它更清洁,更安全。

于 2011-08-31T22:06:51.933 回答
-1

采用

Strings.FormatDateTime("2011-09-01",vbGeneralDate) 
于 2011-09-01T17:50:48.750 回答