我有一个master
形式的字符串(结尾是毫秒)
我想将其转换为数字,最好是"yyyy-mm-dd hh:mm:ss.mmm"
,以保留所有信息
我尝试了Date
,例如
CDate()
但是会出现类型不匹配错误
答案 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))