Qual é a melhor maneira de envolver tempo em torno do dia de trabalho?

votos
4

Eu tenho uma situação onde eu quero adicionar horas para uma data e ter o novo envoltório data em torno do dia de trabalho. I pavimentada até uma função para determinar esta nova data, mas quero ter certeza que eu não estou esquecendo nada.

As horas para ser adicionado é chamado de atraso. Ele poderia facilmente ser um parâmetro para a função em vez disso.

Por favor, poste todas as sugestões. [Aviso 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

Nota : Este provavelmente não vai funcionar se o atraso é mais de 9 horas de duração. Ele nunca deve mudar a partir de 3, por meio de.

EDIT: O objetivo é encontrar a data e hora que você começa como um resultado da adição de várias horas para a hora atual. Isto é usado para determinar um valor padrão a data de vencimento de uma submissão para. Quero acrescentar 3 horas para o tempo atual para obter o tempo de data de vencimento. No entanto, eu não quero datas de vencimento que vão além 17:00 no dia atual. Então, eu tentei ter as horas divididas entre (hoje, até 05:00) e (amanhã, a partir das 8h on), de tal forma que a adição de 3 horas para quatro horas lhe daria 19am, porque uma hora é adicionada ao final de hoje e 2 horas são adicionadas ao início de amanhã.

Publicado 07/08/2008 em 21:21
fonte usuário
Em outras línguas...                            


3 respostas

votos
2

Ok, e quanto a isso? A diferença entre as abordagens devem falar por si.

Além disso, este é testado quase tão longe quanto eu posso jogá-lo. A garantia dura até ... agora.

Espero que ajude!

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
Respondeu 07/08/2008 em 22:20
fonte usuário

votos
2

Você provavelmente deve escrever alguns testes automatizados para cada condição que você pode pensar, e depois é só começar o brainstorming mais, escrever os testes como você pensa deles. Dessa forma, você pode ver, com certeza ele vai trabalhar, e vai continuar a trabalhar se você fazer mais alterações. Olhe para cima Test Driven Development, se você gostar dos resultados.

Respondeu 07/08/2008 em 21:57
fonte usuário

votos
1

Eu tenho trabalhado com a seguinte fórmula (pseudocódigo) com algum sucesso:

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}
Respondeu 08/08/2008 em 03:22
fonte usuário

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