What is the best way to wrap time around a work day?

I have a situation where I want to add a clock to a date and add a new date on a business day. I created a function to determine this new date, but I want to make sure that I don't forget anything.

The clock to be added is called a β€œdelay”. This can be an easy parameter for a function.

Please post any suggestions. [VB.NET Warning]

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 

Note This probably will not work if the delay is more than 9 hours. It should never change from 3 to.

EDIT: The goal is to find the date and time that you get as a result of adding a few hours to the current time. This is used to determine the default value for the filing date. I want to add 3 hours to the current time to get the time. However, I do not want to set dates that go beyond 5 pm on the current day. So, I tried to divide the hours between (today, until 5pm) and (tomorrow, from 8am), so adding 3 hours to 4pm will give you 19 hours, because 1 hour is added to the end of today and 2 hours are added to start tomorrow.

+4
source share
3 answers

You should probably write some automated tests for each condition that you can think of, and then just start brainstorming more by writing tests as you think of them. This way you can make sure that it will work, and will continue to work if you make further changes. If you like the results, check out Test Driven Development.

+2
source

Ok, how about these? The difference between the approaches should speak for itself.

It is also verified as far as I can toss it. Warranty lasts until ... now.

Hope this helps!

 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
source

I worked with the following formula (pseudo-code) with some success:

 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} 
+1
source

Source: https://habr.com/ru/post/1276301/


All Articles