Как лучше всего провести время в течение рабочего дня? - PullRequest
6 голосов
/ 08 августа 2008

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

Добавляемые часы называются «задержкой». Вместо этого это может быть просто параметром функции.

Пожалуйста, оставляйте любые предложения. [VB.NET Предупреждение]

Private Function GetDateRequired() As Date
    ''// A decimal representation of the current hour
    Dim hours As Decimal = Decimal.Parse(Date.Now.Hour) + (Decimal.Parse(Date.Now.Minute) / 60.0) 

    Dim delay As Decimal = 3.0           ''// delay in hours
    Dim endOfDay As Decimal = 12.0 + 5.0 ''// end of day, in hours
    Dim startOfDay As Decimal = 8.0      ''// start of day, in hours

    Dim newHour As Integer
    Dim newMinute As Integer

    Dim dateRequired As Date = Now
    Dim delta As Decimal = hours + delay

    ''// Wrap around to the next day, if necessary
    If delta > endOfDay Then
        delta = delta - endOfDay
        dateRequired = dateRequired.AddDays(1)

        newHour = Integer.Parse(Decimal.Truncate(delta))
        newMinute = Integer.Parse(Decimal.Truncate((delta - newHour) * 60))
        newHour = startOfDay + newHour
    Else
        newHour = Integer.Parse(Decimal.Truncate(delta))
        newMinute = Integer.Parse(Decimal.Truncate((delta - newHour) * 60))
    End If

    dateRequired = New Date(dateRequired.Year, dateRequired.Month, dateRequired.Day, newHour, newMinute, 0)

    Return dateRequired
End Sub

Примечание : Это, вероятно, не будет работать, если задержка превышает 9 часов. Оно никогда не должно меняться от 3 до.

EDIT: Цель состоит в том, чтобы найти дату и время, которые вы получите в результате добавления нескольких часов к текущему времени. Это используется для определения значения по умолчанию для даты выполнения представления. Я хочу добавить 3 часа к текущему времени, чтобы получить время. Тем не менее, я не хочу сроки, которые выходят за рамки 17:00 текущего дня. Итак, я попытался разделить часы между (сегодня, до 17:00) и (завтра, с 8:00), чтобы добавление 3 часов к 16:00 дало бы вам 19:00, потому что 1 час добавлен к концу сегодняшнего дня и 2 часы добавляются к началу завтрашнего дня.

Ответы [ 3 ]

3 голосов
/ 08 августа 2008

Хорошо, а как насчет этого? Разница между подходами должна говорить сама за себя.

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

Надеюсь, это поможет!

Module Module1

    Public Function IsInBusinessHours(ByVal d As Date) As Boolean
        Return Not (d.Hour < 8 OrElse d.Hour > 17 OrElse d.DayOfWeek = DayOfWeek.Saturday OrElse d.DayOfWeek = DayOfWeek.Sunday)
    End Function


    Public Function AddInBusinessHours(ByVal fromDate As Date, ByVal hours As Integer) As Date
        Dim work As Date = fromDate.AddHours(hours)
        While Not IsInBusinessHours(work)
            work = work.AddHours(1)
        End While
        Return work
    End Function


    Public Function LoopInBusinessHours(ByVal fromDate As Date, ByVal hours As Integer) As Date
        Dim work As Date = fromDate
        While hours > 0
            While hours > 0 AndAlso IsInBusinessHours(work)
                work = work.AddHours(1)
                hours -= 1
            End While
            While Not IsInBusinessHours(work)
                work = work.AddHours(1)
            End While
        End While
        Return work
    End Function

    Sub Main()
        Dim test As Date = New Date(2008, 8, 8, 15, 0, 0)
        Dim hours As Integer = 5
        Console.WriteLine("Date: " + test.ToString() + ", " + hours.ToString())
        Console.WriteLine("Just skipping: " + AddInBusinessHours(test, hours))
        Console.WriteLine("Looping: " + LoopInBusinessHours(test, hours))
        Console.ReadLine()
    End Sub

End Module
2 голосов
/ 08 августа 2008

Вам, вероятно, следует написать несколько автоматических тестов для каждого состояния, о котором вы только можете подумать, а затем просто начать больше мозгового штурма, писать тесты так, как вы о них думаете. Таким образом, вы можете убедиться, что он будет работать и продолжит работать, если вы внесете дополнительные изменения. Если вам понравились результаты, посмотрите «Разработка через тестирование».

1 голос
/ 08 августа 2008

Я работал с следующей формулой (псевдокод) с некоторым успехом:

now <- number of minutes since the work day started
delay <- number of minutes in the delay
day <- length of a work day in minutes

x <- (now + delay) / day {integer division}
y <- (now + delay) % day {modulo remainder}

return startoftoday + x {in days} + y {in minutes}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...