excel-VBA如何比较时间段的时间范围

时间:2016-08-25 13:24:27

标签: excel vba excel-vba date

我有两个日期,YYYY-MM-dd hh:mm:ss格式,我有24H的时间范围 - 标准从5:30到21:00。这个范围说从5:30到21:00是一天,从21:00到5:30是一个晚上。我必须检查这个时期的夜晚时间(以秒为单位)以及当天的时间。这是一个例如

A有两个创建期间的日期:

date1 = 2016-08-08 12:31:35(开始)

date2 = 2016-08-09 00:29:11(结束)

时间范围是:从5:30:00到21:00:00是一天,从21:00:00到5:30:00是一个晚上

所以,在我这段时间里,我白天有34105s,晚上有12551s,因为从12:31:35到21:00是34105s,从21:00:00到0:29:11是12551s

问题也出现在我有约会的时候,例如从2016-08-08 12:31:35到2016-08-10 12:31:35当我在我的期间有两天。有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

VBA将日期类型存储为浮点数,小数点右边的时间和左边的日期。您只需使用小数部分即可获得时间分量:

time = someDate - Int(someDate)

因此,您可以定义一些有用的常量来计算如何将时间部分分成白天和黑夜:

Const ONE_SECOND = 1 / 24 / 60 / 60
Const DAY_START = ONE_SECOND * 60 * 60 * 5.5
Const DAY_END = ONE_SECOND * 60 * 60 * 21
Const MIDNIGHT = 1
Const SECONDS_IN_DAY = DAY_END - DAY_START

然后创建一个简单的辅助函数将Double转换为总秒数:

Public Function TotalSeconds(inValue As Double)
    TotalSeconds = Int(inValue) * 24 * 60 * 60 + _
                   Hour(inValue) * 60 * 60 + _
                   Minute(inValue) * 60 + _
                   Second(inValue)
End Function

然后,只需确定天数是否相同,并根据开头和结尾是否在同一天对Double部分进行一些简单的数学计算:

Private Sub Sample()
    Dim starting As Date, ending As Date
    starting = CDate("2016-08-08 12:31:35")
    ending = CDate("2016-08-09 00:29:11")

    Dim days As Long
    'Calculate number of days between dates.
    days = Int(ending) - Int(starting)
    'Remove the date portions
    starting = starting - Int(starting)
    ending = ending - Int(ending)

    Dim day As Double, night As Double
    If days = 0 Then  'Same day?
        day = SECONDS_IN_DAY
        If starting < DAY_START Then
            night = night + DAY_START - starting
        Else
            day = day - (starting - DAY_START)
        End If
        If ending > DAY_END Then
            night = night + (ending - DAY_END)
        Else
            day = day - (DAY_END - ending)
        End If
    Else
        'seconds from the first day.
        If starting > DAY_END Then
            night = MIDNIGHT - starting
        Else
            night = MIDNIGHT - DAY_END
            If starting > DAY_START Then
                day = DAY_END - starting
            Else
                day = SECONDS_IN_DAY
                night = night + (DAY_START - starting)
            End If
        End If
        'seconds from the last day.
        If ending > DAY_END Then
            night = night + (ending - SECONDS_IN_DAY)
            day = day + SECONDS_IN_DAY
        Else
            If ending < DAY_START Then
                night = night + ending
            Else
                night = night + DAY_START
                day = day + (ending - DAY_START)
            End If
        End If
        'seconds from full days in between
        If days > 1 Then
            night = night + ((days - 1) * (1 - SECONDS_IN_DAY))
            day = day + ((days - 1) * SECONDS_IN_DAY)
        End If
    End If

    Debug.Print "Day: " & TotalSeconds(day), "Night: " & TotalSeconds(night)
End Sub

答案 1 :(得分:0)

我有类似的问题,并且我使用了不同的解决方案。 我必须在一天中的特定时间启用3个表单,其中一个表单是从晚上11点到早上7点。

我的解决方案(示例):

If Not (DateAdd("h", 8, TimeValue(Now)) > DateAdd("h", 8, Sheets(1).Range("B25").Value) And DateAdd("h", 8, TimeValue(Now)) < DateAdd("h", 8, Sheets(1).Range("B25").Value)) Then

基本上,我是根据单元格值进行所有计算的,方法是在单元格上加上8小时,这样我就可以避免在午夜工作。

DateAdd("h", 8, TimeValue(Now))

在某些情况下,这应该有助于使代码非常简单和简短。 帮助参考: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/dateadd-function