formato - vb.net date format
¿Cuál es la mejor manera de envolver el tiempo en el día de trabajo? (3)
Tengo una situación en la que quiero agregar horas a una fecha y tener la nueva fecha ajustada alrededor del día de trabajo. Construí una función para determinar esta nueva fecha, pero quiero asegurarme de no olvidar nada.
Las horas que se agregarán se llaman "retraso". En su lugar, podría ser fácilmente un parámetro de la función.
Por favor, publique cualquier sugerencia. [Advertencia de 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 : Esto probablemente no funcionará si el retraso dura más de 9 horas. Nunca debería cambiar de 3 a.
EDITAR: El objetivo es encontrar la fecha y la hora que obtiene como resultado de agregar varias horas a la hora actual. Esto se usa para determinar un valor predeterminado para una fecha de vencimiento de una presentación. Quiero agregar 3 horas a la hora actual para obtener la fecha de vencimiento. Sin embargo, no quiero fechas de vencimiento que vayan más allá de las 5 p.m. del día actual. Entonces, intenté dividir las horas entre (hoy, hasta las 5 p.m.) y (mañana, a partir de las 8 a.m.), de modo que agregar 3 horas a las 4 p.m. le daría las 19 a.m., porque se agrega 1 hora hasta el final de hoy y 2 las horas se agregan al comienzo de mañana.
Está bien, ¿qué hay de estos? La diferencia entre los enfoques debería hablar por sí misma.
Además, esto se prueba hasta donde puedo arrojarlo. La garantía dura hasta ... ahora.
¡Espero eso ayude!
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
Probablemente deberías escribir algunas pruebas automáticas para cada condición que se te ocurra, y luego comenzar a generar más lluvia de ideas, escribiendo las pruebas a medida que piensas en ellas. De esta manera, puede ver con certeza que funcionará, y seguirá funcionando si realiza más cambios. Busque Desarrollo basado en prueba si le gustan los resultados.
He trabajado con la siguiente fórmula (pseudocódigo) con cierto éxito:
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}