Функция, чтобы проверить, если текущее время находится в окно времени


Я написал следующий код, который проверяет, является ли текущее время в интервал времени. Это, кажется, работает нормально с мои тестовые случаи, но мне было бы интересно, если кто-то может увидеть любые возможные проблемы или есть идеи по улучшению?

Public Function IsCurrentTimeBetween(ByRef dteStartTime As DateTime, ByRef dteEndTime As DateTime) As Boolean

    Dim dteStart As DateTime, dteEnd As DateTime, dteCurrent As DateTime

    'strip off any date portion of the dates
    dteStart = Format(dteStartTime, "HH:mm:ss")
    dteEnd = Format(dteEndTime, "HH:mm:ss")
    dteCurrent = Format(DateTime.Now, "HH:mm:ss")

    If dteEnd < dteStart Then
        'the times span midnight
        If dteCurrent < dteStart And dteCurrent < dteEnd Then
            dteCurrent = dteCurrent.AddDays(1)
        End If
        dteEnd = dteEnd.AddDays(1)
    End If

    Return (dteStart <= dteCurrent AndAlso dteCurrent <= dteEnd)

End Function

Использование:

'Work out if we are between 5 to midnight and quarter past midnight    
Debug.WriteLine("Is in midnight window? " + IsCurrentTimeBetween("23:55", "00:15").ToString)


6144
6
задан 18 мая 2011 в 08:05 Источник Поделиться
Комментарии
4 ответа

Вы принимаете даты и времени, форматирование его в строку, затем назначается на другую дату и время, просто чтобы получить время суток. Это не будет компилироваться с опцией строго по. То, что вы хотите предусмотренных даты и времени.TimeOfDay.

Я также хотел бы изменить byref в byval в списке параметров.

Когда вы сравниваете периода, а не дата, вы не должны делать дата добавления. Вы можете просто обнаружить по периметру случай и вам остается только проверить endTime.

 Public Function IsCurrentTimeBetween(ByVal dteStartTime As DateTime, ByVal dteEndTime As DateTime) As Boolean

Dim startTime, endTime, currentTime As TimeSpan

startTime = dteStartTime.TimeOfDay
endTime = dteEndTime.TimeOfDay
currentTime = Now.TimeOfDay

If endTime < startTime Then
'the times span midnight
Return (currentTime <= endTime)
Else
'the times do not span midnight
Return (startTime <= currentTime AndAlso currentTime <= endTime)
End If

End Function

5
ответ дан 19 мая 2011 в 03:05 Источник Поделиться

Пару простых вещей:

Вы передаете в параметры по ссылке безосновательно. Этот способ передачи является полезным, если вам необходимо внести изменения в переменных, которые наблюдаются в callsite, но это должно было бы избежать, так как это может ввести в ошибка, которые могут быть более трудно отследить, если вы сделаете ошибку. Просто получите свои параметры бывал.

Во-вторых, я бы посоветовала вам отойти от венгерской нотации. Я был там, я знаю все аргументы за его сохранение. Фигня. В вашем фрагменте кода, у вас есть переменные, такие как dteStartTime и dteStart. После того, как вы измените параметры метода должны быть как byval, вы можете затем изменить код, чтобы иметь один переменный для начала , а потом еще за endTime. Если вы давать переменным осмысленные имена, вы узнаете, что вы никогда не пропустите старинном венгерском стиле. Действительно, я считаю, что с помощью венгерских часто сопровождается остальное переменной имя сокращенное, искаженном виде.

3
ответ дан 18 мая 2011 в 12:05 Источник Поделиться

мне нужно, чтобы иметь возможность перейти в строку, представляющую время. . .так вот мое решение (vb.net). Не встречал сценарий, это не сработает для.

Function isBetween(ByVal timestart As String, ByVal timeEnd As String, ByVal checkDate As Date) As Boolean
Dim dtBegin As Date = Date.Parse(Now.ToShortDateString & " " & timestart)
Dim dtEnd As Date = Date.Parse(Now.ToShortDateString & " " & timeEnd)

If dtBegin > dtEnd Then 'times span midnight
dtEnd = dtEnd.AddDays(1)

If dtBegin > checkDate And dtEnd > checkDate Then 'checkdate is after midnight, make adjustment
dtBegin = dtBegin.AddDays(-1)
dtEnd = dtEnd.AddDays(-1)
End If
End If

If checkDate >= dtBegin AndAlso checkDate < dtEnd Then Return True

Return False
End Function

2
ответ дан 13 ноября 2012 в 12:11 Источник Поделиться

Соглашаясь с Джеффом П.

Private Sub Button2_Click(sender As System.Object, _
e As System.EventArgs) Handles Button2.Click

'Work out if we are between 5 to midnight and quarter past midnight
Debug.WriteLine("Is in midnight window? " + IsCurrentTimeBetween(DateTime.Parse("23:55"), DateTime.Parse("00:15"), #12:01:00 AM#).ToString)

Dim d As DateTime = #12:00:00 AM#
Dim de As DateTime = #11:59:00 PM#

Do While d < de
Debug.WriteLine("{0:HH:mm} {1:HH:mm} {2}", d, d.AddMinutes(20), IsCurrentTimeBetween(d, d.AddMinutes(20), #12:01:00 AM#))
d = d.AddMinutes(5)
Loop
End Sub

Public Function IsCurrentTimeBetween(ByVal dteStartTime As DateTime, _
ByVal dteEndTime As DateTime, _
Optional curTime? As DateTime = Nothing) As Boolean
'Jeff Paulsen's code with small change for testing
Dim startTime, endTime, currentTime As TimeSpan

startTime = dteStartTime.TimeOfDay
endTime = dteEndTime.TimeOfDay
If Not curTime.HasValue Then currentTime = DateTime.Now.TimeOfDay Else currentTime = curTime.Value.TimeOfDay

If endTime < startTime Then
'the times span midnight
Return (currentTime <= endTime)
Else
'the times do not span midnight
Return (startTime <= currentTime AndAlso currentTime <= endTime)
End If

End Function

0
ответ дан 23 мая 2011 в 03:05 Источник Поделиться