以下代码采用自午夜以来的分钟时间范围,并创建一个小时为pr小时的数组。但是,它很慢。还有更好的建议吗? (不,改变语言不是一种选择:-))
Const clDeparture As Long = 123
Const clArrival As Long = 233
Dim lHour As Long
Dim lMinute As Long
Dim alHour(25) As Long
For lMinute = 0 To 1440
If lMinute >= clDeparture And lMinute < clArrival Then
alHour(Int(lMinute / 60)) = alHour(Int(lMinute / 60)) + 1
End If
Next
数组现在应该包含:
(0,0) (1,0) (2,57) (3,53) (4,0).....
此致
答案 0 :(得分:1)
那么,怎么样:
For lMinute = clDeparture To clArrival - 1
alHour(Int(lMinute / 60)) = alHour(Int(lMinute / 60)) + 1
Next
鉴于你只会在clDeparture
和clArrival
之间采取任何行动,所以没有必要循环其余部分。
这是一个简单的开始。您当然可以通过查看每个小时而不是每个分钟来改进它,并检查该时间段的“覆盖”时间段的比例。那会比较棘手,但肯定可行。我不想冒险在VB中编写代码,但如果你真的想要,我可能会掀起一个C#版本。我从简单的代码开始,看看它是否足够快。
答案 1 :(得分:1)
您想知道时间跨度内每小时的分钟数吗? 我认为这应该做到,或者接近它:
lDepHour = Int(clDeparture / 60)
lDepMinute = clDeparture - lDepHour * 60
lArrHour = Int(clArrival / 60)
lArrMinute = clArrival - lArrHour * 60
If (lDepHour = lArrHour) Then
alHour(lDepHour) = lArrMinute - lDepMinute
Else
alHour(lDepHour) = 60 - lDepMinute
alHour(lArrHour) = lArrMinute
For lHour = lDepHour + 1 To lArrHour - 1
alHour(lHour) = 60
End For
End If
这应该比你的速度快60倍。
P.S。如果时间跨度可以跨越午夜(到达&lt;离开),则在到达时间中添加24 * 60,执行相同的逻辑,如果lHour >= 24
,则将数字放在lHour - 24
。
答案 2 :(得分:0)
使用整数运算而不是浮点运算:
Int(lMinute / 60)
与
相同lMinute \ 60
但后者更快,因为它使用整数除法,无需将Long
转换为Double
并返回。此外,VB6不能很好地优化。如果需要两次该值,请考虑将结果存储在变量中。