7

日付に時間を追加し、新しい日付を稼働日にラップしたい状況があります。この新しい日付を決定する関数を作りましたが、何も忘れていないことを確認したいと思います。

加算される時間は「遅延」と呼ばれます。代わりに、簡単に関数のパラメーターにすることができます。

提案を投稿してください。【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 までは決して変化しないはずです。

編集: 目標は、現在の時刻に数時間を追加した結果として得られる日付と時刻を見つけることです。これは、提出期限のデフォルト値を決定するために使用されます。期日を取得するために、現在の時刻に 3 時間を追加したいと考えています。ただし、当日の午後 5 時を超える期日は望ましくありません。そこで、(今日の午後 5 時まで) と (明日の午前 8 時から) の間で時間を分割して、午後 4 時に 3 時間を追加すると午前 19 時になるようにしました。時間は明日の初めに追加されます。

4

3 に答える 3

3

さて、これらはどうですか?アプローチの違いはそれ自体を物語っています。

また、これは私が投げることができる限りテストされています。保証は...今まで続きます。

それが役に立てば幸い!

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
于 2008-08-07T21:20:33.563 に答える
2

おそらく、考えられる条件ごとにいくつかの自動化されたテストを作成し、さらにブレインストーミングを開始して、思いついたとおりにテストを作成する必要があります。このようにして、それが機能することを確認でき、さらに変更を加えても引き続き機能します。結果が気に入ったら、テスト駆動開発を調べてください。

于 2008-08-07T20:57:40.723 に答える
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}
于 2008-08-08T02:22:08.383 に答える