1

Win7 上的 MS Excel Professional Plus v14。

我无法比较日期/时间的相等性。

两个看起来相等的日期,12/16/2013 12:19:33 pm 都被标注为日期。一个在日期数组中,另一个是日期变量。arrPP 稍后会重新调整。当我执行 DateDiff("s",date1,date2) 时,它会产生 0。

Dim arrPP() As Date          ' During runtime shows type is Date(1 to 2, 1 to 1)
Dim dNextStartTime as Date

'...code removed ...

    If arrPP(iPP_START, lPP_index) <= dNextStartTime Then
        GoTo PP_OUT
    End If

即使它们是相等的,上面的评估结果为假并且采取了错误的路径。这很难追踪并导致意外/错误的结果。

是否有关于日期平等的官方“陷阱”?是否存在需要比较的隐藏毫秒,或者将比较限制到秒级别的方法?

我尝试了其他几种替代方法,包括将 CDate 放在数组元素的前面。

失败:

    If Not(arrPP(iPP_START, lPP_index) > dNextStartTime) Then
        GoTo PP_OUT
    End If

PASS:(但谁会想到这样做呢?)

    If arrPP(iPP_START, lPP_index) <= dNextStartTime Or _
       DateDiff("s",arrPP(iPP_START,lPP_index),dNextStartTime) = 0 Then
        GoTo PP_OUT
    End If
4

3 回答 3

4

这很可能是由于浮点精度问题。日期存储为双精度浮点数,其中整数部分是日期,小数部分是时间。

测试是否arrPP(iPP_START,lPP_index)dNextStartTime它可能最好使用之前

If DateDiff("s",dNextStartTime,arrPP(iPP_START,lPP_index)) <= 0 Then

请注意,DateDiff当第一个日期参数早于第二个日期参数时,返回正数。

要演示两个明显相等的日期可能不相等,请尝试运行此

Sub demo()
    Dim d1 As Date, d2 As Date

    d1 = #12/17/1986 12:19:33 PM#

    d2 = #12/17/1986#
    d2 = d2 + 12# / 24#             ' Add 12 hour
    d2 = d2 + 19# / 60# / 24#       ' Add 19 minutes
    d2 = d2 + 33# / 60# / 60# / 24# ' Add 33 seconds

    Debug.Print d1; d2
    Debug.Print d1 = d2
    Debug.Print d1 - d2
End Sub

立即窗口输出

17/12/1986 12:19:33 pm 17/12/1986 12:19:33 pm
错误
3.63797880709171E-12

于 2013-10-22T00:36:10.150 回答
1

VBA Excel - 相等的日期不评估为相等

这个对我有用。

我想这归结为您如何将日期存储在日期变量或日期数组中。你如何填充日期?

这是我所做的测试。如果我误解了您的查询,请告诉我。

Sub Sample()
    Dim dt As Date
    Dim MyAr(1, 1) As Date

    dt = #12/16/2013 12:19:33 PM#
    MyAr(1, 1) = #12/16/2013 12:19:33 PM#

    If (MyAr(1, 1) > dt) Then
        MsgBox "MyAr is greater"
    ElseIf (MyAr(1, 1) < dt) Then
        MsgBox "MyAr is lesser"
    Else
        MsgBox "They are equal" '<~~ This is what I get
        Debug.Print DateDiff("s", MyAr(1, 1), dt)
    End If
End Sub
于 2013-10-22T04:45:43.110 回答
0

很可能多年后您不需要答案,但如果有人加入这个问题,也许它会很有用。

Function DateEqual(date1 As Date, date2 As Date) As Boolean
    'use should never compare as equal dates or any double values but if you really need to do it carefully use this function.
    'converting to integers to test if they are equal. if you need to test time values recorded with less then 1second DO NOT USE THIS FUNCTION.
    Dim day1, day2 As Date
    Dim time1, time2 As Date
    day1 = Int(date1)
    day2 = Int(date2)
    If day1 = day2 Then
        If Hour(date1) = Hour(date2) And Minute(date1) = Minute(date2) And Second(date1) = Second(date2) Then
            DateEqual = True: Exit Function
        Else
            DateEqual = False: Exit Function
        End If
    Else
        DateEqual = False: Exit Function
    End If
End Function
于 2018-07-06T11:27:54.733 回答