我实现了一个检查vb.net中时间范围的函数。但它给了我错误的输出。 我的开始时间是每天11.00 Pm,结束时间是5.00 AM。如果我通过1.10 AM我的功能不会返回真正的输出,因为它属于该时间范围。不确定我做错了什么。
Private Function CheckTimeRange() As Boolean
Dim retValue As Boolean = True
Try
Dim Dt As DateTime = DateTime.Now
Dim StartDt As DateTime = Convert.ToDateTime("11.00 PM")
Dim EndDt As DateTime = Convert.ToDateTime("5.00 AM")
Dim startTime As New TimeSpan(StartDt.Hour, StartDt.Minute, 0)
Dim endTime As New TimeSpan(EndDt.Hour, EndDt.Minute, 0)
Dim now As TimeSpan = DateTime.Now.TimeOfDay
If (now > startTime) AndAlso (now < endTime) Then
retValue = True
Else
retValue = False
End If
Return retValue
Catch ex As Exception
End Try
End Function
答案 0 :(得分:8)
我认为你的代码过于复杂。你可以这样做:
Private Function CheckTimeRange() As Boolean
Return DateTime.Now.Hour >= 23 OrElse DateTime.Now.Hour < 5
End Function
修改强>
如果用户输入了开始时间和结束时间,则应首先将字符串值转换为TimeSpan
个对象,然后您可以使用更灵活的方法,该方法将日期,最小时间和最长时间作为参数:
Private Function CheckTimeRange(myDate As DateTime, minTime as TimeSpan, maxTime As TimeSpan) As Boolean
If minTime > maxTime Then
Return myDate.TimeOfDay >= minTime OrElse myDate.TimeOfDay < maxTime
Else
Return myDate.TimeOfDay >= minTime AndAlso myDate.TimeOfDay < maxTime
End If
End Function
使用示例:
Dim minTime As New TimeSpan(23, 0, 0) 'Should be converted from 11.00 PM
Dim maxTime As New TimeSpan(5, 0, 0) 'Should be converted from 5.00 AM
CheckTimeRange(New Date(2012, 1, 1, 15, 0, 0), minTime, maxTime) '==> false
CheckTimeRange(New Date(2012, 1, 1, 22, 30, 0), minTime, maxTime) '==> false
CheckTimeRange(New Date(2012, 1, 1, 23, 00, 0), minTime, maxTime) '==> true
CheckTimeRange(New Date(2012, 1, 2, 1, 10, 0), minTime, maxTime) '==> true
CheckTimeRange(New Date(2012, 1, 2, 4, 59, 0), minTime, maxTime) '==> true
CheckTimeRange(New Date(2012, 1, 2, 5, 10, 0), minTime, maxTime) '==> false
如果您在将字符串值转换为TimeSpan时遇到问题,则应该针对此特定任务提出新问题。
答案 1 :(得分:0)
你正在使用TimeSpan对象,你会发现1.10 AM从未超过没有日期的晚上11点。
Meta-Knight有更好的解决方案。