我有两个日期,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当我在我的期间有两天。有谁知道如何解决这个问题?
答案 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