我有以下字符串:
01/04/2019 11:32:45
和
01/04/2019 11:38:13
我希望能够比较两个时间,然后将结果添加到单元格中。
我最好使用中间的空格分割字符串,然后尝试将其转换为可读时间吗?
最简单的方法是什么?
搜索了几个论坛,它们似乎都比我认为简单的任务略高一些
欢呼
答案 0 :(得分:1)
这将比较两个字符串的 时间 元素(将另一个字符串相减),然后将格式化后的差异返回为小时,分钟和秒:
Dim starttime As String
Dim endtime As String
starttime = "01/04/2019 11:32:45"
endtime = "01/04/2019 11:38:13"
timedif = TimeValue(endtime) - TimeValue(starttime)
Debug.Print Format(timedif, "hh:MM:ss")
如果您还希望有另外的 天 ,可以使用:
timedatedif = (DateValue(endtime) + TimeValue(endtime)) - (DateValue(starttime) +TimeValue(starttime))
Debug.Print Format(timedatedif, "dd:hh:MM:ss")
答案 1 :(得分:1)
如果您的字符串包含日期,则最好将它们转换为真实的Date
值。
您可以使用函数CDate
将字符串转换为日期,但是有很多陷阱,例如根据您计算机的区域设置,日期格式(以及日,月和年的顺序)可能会更改,CDate
将尝试遵守这些设置。如果您的代码在世界的另一部分运行,则相同的输入可能会导致日期不同。这可能是您发现复杂代码将字符串分成多个部分以获取日期的单个部分的原因。
日期存储为Double
值。数字的整数部分定义日期,从31.12.1899开始。小数部分代表时间。要获得两个日期之间的差,您可以简单地将它们减去。
现在问题来了,您想如何处理差异。您可以编写返回此差异的UDF并设置单元格的格式以仅显示时间部分。如果您的差异> 1天,请仔细考虑。或者,您可以将差乘以24以获得小时数,或者乘以24 * 60以获得分钟数。
UDF看起来像
Function TimeDiff(s1 As String, s2 As String) As Date
Dim d1 As Date, d2 As Date
d1 = CDate(s1)
d2 = CDate(s2)
TimeDiff = IIf(d1 > d2, d1 - d2, d2 - d1)
End Function
假设日期字符串位于A1和B1中,则可以将公式=TimeDiff(A1, B1)
写入单元格C1。
获取分钟数的替代方法(请注意不同的返回值类型):
Function TimeDiffInMinutes(s1 As String, s2 As String) As Long
Dim d1 As Date, d2 As Date, diff As Date
d1 = CDate(s1)
d2 = CDate(s2)
Diff = IIf(d1 > d2, d1 - d2, d2 - d1)
TimeDiffInMinutes = Diff * 24 * 60
End Function
当日期不同时,两个功能都将没有问题。
如果输入格式始终为01/04/2019 11:38:13
格式,但CDate将4月1日与1月4日混淆,则可以编写一个小的函数来手动拆分字符串并从中创建日期。只需将对CDate
的调用替换为对自己的转换函数的调用即可:
Function stringToDate(s As String) As Date
Dim pieces() As String, datePieces() As String, timePieces() As String
pieces = Split(s, " ")
datePieces = Split(pieces(0), "/")
timePieces = Split(pieces(1), ":")
stringToDate = DateSerial(datePieces(2), datePieces(1), datePieces(0)) _
+ TimeSerial(timePieces(0), timePieces(1), timePieces(2))
End Function