我有一种情况,我想在一个日期添加小时,并在工作日周围换新日期。 我拼凑了一个函数来确定这个新日期,但我想确保我没有忘记任何事情。

要添加的小时称为“延迟”。 它很容易成为函数的参数。

请发布任何建议。 [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点开始),这样加上3个小时到下午4点会给你19点,因为1小时被添加到今天结束,2小时被添加到明天开始。

===============>>#1 票数: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

===============>>#2 票数:2

您应该为您能想到的每个条件编写一些自动化测试,然后开始集思广益,按照您的想法编写测试。 这样,您可以确定它将起作用,并且如果您进行进一步更改,它将继续有效。 如果您喜欢结果,请查找测试驱动开发。

===============>>#3 票数: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}

  ask by EndangeredMassa translate from so

未解决问题?本站智能推荐:

4回复

在VB中,计算每个月的第5个工作日

在VB中,我可以使用什么编码来计算每个月的第5个工作日? 如果第五天是一天假期。
2回复

vb.net-如何从工作日名称中获取日期号

长话短说: 我需要使用以下术语的WeekdayName()的反向函数: 您提供星期几的名称 (例如星期日) 您将获得对应的工作日编号 (这取决于WeekdayName返回的第一个WeekdayName ,例如,如果星期日是一周中的第一天,则星期日将获得1) 背景:
3回复

计算每个工作日日期

好吧,所以我有以下代码来获取文件夹名称中的最后4个字符,它始终是日期,格式为MMDD。 此日期也将始终是星期一日期。 正在修剪的文件夹名称示例如下:C:\\ Temp \\ Textfiles \\ 20120813 我不确定的是,如何计算该周的剩余天数,结束于星期五。 很遗憾
4回复

获取经过一段时间(DateTime)的年,月,日

如何从日期时间选取器值显示年龄,月,日。 例如: 最终结果将为“ 1年0个月1天”。 但是获得该结果不仅仅只是减去DateTime.Year值等等。 有人知道数学公式或数学计算吗?
3回复

找到在VB.net中获取当前日期/时间的所有方法

我有一个500K +行的vb.net应用程序,在过去的5年里由10多个不同的开发者编写。 很多时候它会获得系统时间和/或日期并依赖它。 现在我必须通过程序重新运行真实案例以进行回归测试,并且它会破坏日期/时间的重要情况。 我的修复很容易,只需用程序获取当前日期/时间替换程序中获取当前日
3回复

日期格式:13年10月17日

日期是否有预定格式,如13年10月17日? 我似乎找不到这样的格式? 当然,我可以从不同的日期部分手动进行解释,但是格式会很酷。 此MSDN页面未显示日期格式。
1回复

计算前几年的相应日历日

我有以下SQL(DB2)语句的野兽... 以输入日期2012年3月28日为准,此日期将返回2006年3月29日星期三。 请注意,它与星期四匹配。 它与前几年的相应日历日匹配。 在C#或VB.NET中是否有更优雅的方法来实现相同的目标? 我曾尝试将此查询转换为VB.NET,但无
4回复

ASP.NET:自1970年1月1日起获得毫秒数

我有一个ASP.NET,VB.NET日期,我试图获得自1970年1月1日以来的毫秒数。我试图在MSDN中寻找一种方法,但我找不到任何东西。 有谁知道如何做到这一点?
2回复

VB.net,如何选择2日期之间的日期

如何使用datetimepicker在2个日期之间选择日期。 我在用
1回复

如何只比较vb.net中的日部分和月部分

我的要求是我必须计算某个日期的发生,并且假设我有2012年1月10日,现在我有两个月之间,而我的日期范围是2013年2月1日至2012年1月1日。我的要求是,如果我发现10 -jan介于2012年1月1日至2013年2月1日之间,无论年份如何我都知道10 jan将在2012年1月1日至2013年