到目前为止的VBA字符串,以毫秒为单位

时间:2017-12-23 10:50:25

标签: excel vba datetime

我有一个master形式的字符串(结尾是毫秒)

我想将其转换为数字,最好是"yyyy-mm-dd hh:mm:ss.mmm",以保留所有信息

我尝试了Date,例如

CDate()

但是会出现类型不匹配错误

5 个答案:

答案 0 :(得分:4)

Date类型保存自December 30 1899以来的天数,精确度为1秒。虽然通过将日期存储在货币类型中仍然可以保持毫秒数,因为与日期/双数相比,它可以容纳4个额外数字。

所以另一种方法是将日期存储为Currency类型的时间戳,表示自December 30 1899以来的秒数:

Public Function CDateEx(text As String) As Currency
    Dim parts() As String
    parts = Split(text, ".")
    CDateEx = CCur(CDate(parts(0)) * 86400) + CCur(parts(1) / 1000)
End Function

并将时间戳转换回字符串:

Public Function FormatDateEx(dt As Currency) As String
    FormatDateEx = Format(dt / 86400, "yyyy-mm-dd HH:mm:ss") & "." & ((dt - Fix(dt)) * 1000)
End Function

答案 1 :(得分:0)

以下代码包含管理日期和毫秒所需的所有组件。

Private Sub ParseTime()

    Dim strTime As String
    Dim Sp() As String
    Dim Dt As Double

    strTime = "2017-12-23 10:29:15.221"
    Sp = Split(strTime, ".")
    strTime = Sp(0)

    Dt = CDbl(CDate(strTime))
    strTime = "yyyy-mm-dd hh:mm:ss"
    If UBound(Sp) Then
        Dt = Dt + CDbl(Sp(1)) * 1 / 24 / 60 / 60 / (10 ^ Len(Sp(1)))
        strTime = strTime & "." & CInt(Sp(1))
    End If
    Debug.Print Format(Dt, strTime)
End Sub

我不能说我对解决方案完全满意,因为打印只是隐含地等于日期值。但是,我发现以前有效的日期/时间格式,如“yyyy-mm-dd hh:mm:ss.000”,自2007年以来似乎不起作用。但是,应该可以最终证明日期/时间值等于上面包含的格式掩码I的渲染。

答案 2 :(得分:0)

为什么不在将整秒作为日期值后使用DateAdd添加最后0.233秒?

Dim Str As String, MS As String
Dim DateValue As Date
Dim L as Integer
Str = "2017-12-23 10:29:15.223"
For L = 1 to Len(Str)
    If Left(Right(Str, L), 1) = "." Then
        MS = "0" & Right(Str, L)
        Str = Left(Str, Len(Str) - L)
        Exit For
    End If
Next L
DateValue = CDate(Str)
If MS <> "" Then DateValue = DateAdd("S",MS,DateValue)

答案 3 :(得分:0)

当小数部分四舍五入时,迈克尔的答案有一个错误(由吉姆发现)。

以下内容纠正了该错误(使用参数化格式格式将其略微修改了十分之一秒而不是毫秒)。

Public Function FormatDateEx(dt As Currency, formatPattern As String) As String
    Rem FormatDateEx = Format(dt / 86400, "yyyy-mm-dd HH:mm:ss") & "." & ((dt - Fix(dt)) * 1000)
    Dim decimalPart As Double
    decimalPart = Round(((dt - Fix(dt)) * 10), 0)
    If (decimalPart = 10) Then
        FormatDateEx = format(dt / 86400, formatPattern) & ".0"
    Else
        FormatDateEx = format(Fix(dt) / 86400, formatPattern) & "." & decimalPart
    End If
End Function

答案 4 :(得分:-1)

使用Left$函数修剪小数点和毫秒:

Dim dateValue As Date
dateValue = CDate(Left$("2017-12-23 10:29:15.223", 19))