2008-08-07 2 views
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 번에서부터 변경해서는 안됩니다.

편집 : 목표는 현재 시간에 몇 시간을 추가 한 결과로 얻은 날짜와 시간을 찾는 것입니다. 이것은 제출 기한의 기본값을 결정하는 데 사용됩니다. 기한을 정하기 위해 현재 시간에 3 시간을 더하고 싶습니다. 그러나 나는 당일 오후 5시를 초과하는 마감일을 원하지 않습니다. 오늘 (오늘 오후 5 시까 지)과 (내일 오전 8시에) 시간을 나누려고했는데, 오후 4시에 3 시간을 추가하면 오늘 오후 1 시가 추가되고 오후 2시에 2 시간 추가되기 때문에 19 시가됩니다. 시간은 내일의 시작에 추가됩니다.

답변

2

생각할 수있는 각 조건에 대한 자동화 된 테스트를 작성한 다음 더 많은 브레인 스토밍을 시작하고 생각대로 테스트를 작성해야합니다. 이 방법을 사용하면 작동 여부를 확인할 수 있으며 추가 변경 작업을 계속 수행 할 수 있습니다. 결과가 마음에 든다면 Test Driven Development를 찾으십시오.

+0

이 대답은 아니지만 그것은 upvote에 있습니다. –

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 
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} 
+0

나는이 문제에 대한 계수 연산을 할 방법을 찾고 있었다. 멋진 것. – EndangeredMassa