date值减法产生错误的错误

我正在使用下面的代码来显示在日:小时:分钟格式的date差异。

Function TimeSpan(dt1, dt2) Dim seconds,minutes,hours,days If (isDate(dt1) And IsDate(dt2)) = false Then TimeSpan = "00:00:00" Exit Function End If seconds = Abs(DateDiff("S", dt1, dt2)) minutes = seconds \ 60 hours = minutes \ 60 days = hours \ 24 minutes = minutes mod 60 seconds = seconds mod 60 days = days mod 24 if len(hours) = 1 then hours = "0" & hours TimeSpan = days& ":" & _ RIGHT("00" & hours , 2) & ":" & _ RIGHT("00" & minutes, 2) End Function 

但是在某些情况下不会产生预期值。

  D1=#9/24/2012 8:09:15 AM# and D2=#9/25/2012 8:09:15 AM# gives correct data like 1:24:00 whereas below are producing error when working with VBScript and Excel. D1=#9/5/2012 8:45:43 AM# and D2=#9/25/2012 8:45:43 AM# result=0.888888888888889 D1=#9/6/2012 8:29:34 AM# and D2=#9/17/2012 8:59:36 AM# result=0.503125 

你能解释为什么吗?

谢谢

UDF中尝试我以前的post的答案,如下所示:答案在VBA中

请声明所有variables,强制自己声明通过添加选项显式:)

 option explicit Function TimeSpan(dt1 As Date, dt2 As Date) As String Dim dtTemp As Date Application.ScreenUpdating = False If (IsDate(dt1) And IsDate(dt2)) = False Then TimeSpan = "00:00:00" Exit Function End If If dt2 < dt1 Then dtTemp = dt2 dt2 = dt1 dt1 = dt2 End If '-- since you only had days, I have put up to days here. '-- if you require months, years you may use yy:mm:dd:hh:mm:ss '-- which is pretty self-explainatory ;) TimeSpan = Application.WorksheetFunction.Text((dt2 - dt1), "dd:hh:mm:ss") Application.ScreenUpdating = False End Function 

UDF输出:

在这里输入图像说明

但是,如果您有这样的自由和可能,我真的build议您使用Excel工作表function。


如果date差异超过31天

然后按照本文使用解决scheme将DateDiff合并到UDF中。

请注意我更习惯写VBA,所以你可能需要在这里和那里调整。

另外,你也可以把彼此的两个date减去数值:

 Dim dblDateDiff as Double dblDateDiff = Abs(dt2 - dt1) 

现在时间跨度将会是(不要使用“d”,因为这将不包括可能已经过去的月份和年份):

 Timespan = Int(dblDateDiff) & ":" & Hour(dblDateDiff) & ":" & Minute(dblDateDiff) 

如果Timespan的方向(正值或负值)是相关的,则可以将最后一行更改为:

 Timespan = Sgn(dblDateDiff) * Int(dblDateDiff) & ":" & Hour(dblDateDiff) & ":" & Minute(dblDateDiff) 

对于你的时间格式问题:

  1. 将输出单元格的数字格式设置为文本或
  2. 在string的其余部分添加单引号:

      Timespan = "'" & Sgn(dblDateDiff) * Int(dblDateDiff) & ":" & Hour(dblDateDiff) & ":" & Minute(dblDateDiff)