如果您有包含日期的字符串,最好将它们转换为真实的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