Что это лучший способ, чтобы обернуть время вокруг рабочего дня?

голоса
4

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

Часы, которые будут добавлены называется «задержка». Он легко может быть параметром функции вместо.

Пожалуйста, размещать какие-либо предложения. [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 часа к текущему времени, чтобы получить должное время даты. Тем не менее, я не хочу из-за даты, которые выходят за рамки 5 вечера текущего дня. Таким образом, я пытался иметь часы раскол между (сегодня, до 5 вечера) и (завтра, с 8 утра на), таким образом, что добавление 3-х часов до 4 вечера даст вам 19am, потому что 1 часы добавляются к концу дня и 2 часы будут добавлены в начале будущего.

Задан 07/08/2008 в 21:21
источник пользователем
На других языках...                            


3 ответов

голоса
2

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

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

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

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
Ответил 07/08/2008 в 22:20
источник пользователем

голоса
2

Вы, вероятно, следует написать несколько автоматизированных тестов для каждого условия вы можете думать, а затем просто начать мозговой штурм более, написание тестов, как вы думаете о них. Таким образом, вы можете убедиться, что он будет работать, и будет продолжать работать, если вы сделаете дальнейшие изменения. Посмотрите Test Driven Development, если вам нравятся результаты.

Ответил 07/08/2008 в 21:57
источник пользователем

голоса
1

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

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}
Ответил 08/08/2008 в 03:22
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more