如何检查时间范围

时间:2012-05-09 14:29:57

标签: vb.net

我实现了一个检查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

2 个答案:

答案 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有更好的解决方案。