Datetime 对某些日期/时间计算感到困惑

Datetime 对某些日期/时间计算感到困惑,datetime,Datetime,因此,我试图计算两次约会之间符合特定标准的时间(这里是:工作/非工作),但我对结果感到困惑,因为我无法找出错误的原因 但首先,一些代码 **Input Date A:** 2009-01-01 2:00 pm **Input Date B:** 2009-01-02 9:00 am 因此,如您所见,总时间跨度(例如通过DateB.Substract(DateA))计算)为19小时 现在,我想根据从上午8点到下午5点的平均工作日,计算这个时间段中有多少小时是“非工作”时间-结果应该是15小时(因

因此,我试图计算两次约会之间符合特定标准的时间(这里是:工作/非工作),但我对结果感到困惑,因为我无法找出错误的原因

但首先,一些代码

**Input Date A:** 2009-01-01 2:00 pm
**Input Date B:** 2009-01-02 9:00 am
因此,如您所见,总时间跨度(例如通过
DateB.Substract(DateA)
)计算)为19小时

现在,我想根据从上午8点到下午5点的平均工作日,计算这个时间段中有多少小时是“非工作”时间-结果应该是15小时(因此,19-15=4小时总工作时间)(下午2:00到下午5:00加上上午8:00到上午9:00)

但是,按照我的代码

DateTime _Temp = new DateTime(2009, 1, 1, 14, 0, 0);
DateTime _End = new DateTime(2009, 1, 2, 9, 0, 0);

int _WorkDayStart = 8;
int _WorkDayEnd = 17;

int _Return = 0;

while (_End > _Temp)
{
    if (_Temp.Hour <= _WorkDayStart || _Temp.Hour >= _WorkDayEnd)
    _Return++;
    _Temp = _Temp.AddHours(1);
}
DateTime\u Temp=newdatetime(2009,1,1,14,0,0);
DateTime _End=新的DateTime(2009,1,2,9,0,0);
int _WorkDayStart=8;
int _workdaynd=17;
int _Return=0;
而(\u End>\u Temp)
{
如果(_临时小时=_工作日)
_Return++;
_温度=_温度增加小时数(1);
}
结果是16小时(19-16=3小时总工作时间)-我不知道错误在哪里,所以少了一小时?!我在纸上重构了它,它应该能按预期工作。。。但事实并非如此:-/

有人看到错误了吗?

你把两端都算作非工作,而不是一个。这一行:

if (_Temp.Hour <= _WorkDayStart || _Temp.Hour >= _WorkDayEnd)
另一种方法是将其更改为for循环。通过所有这些更改,代码将是:

DateTime start = new DateTime(2009, 1, 1, 14, 0, 0);
DateTime end = new DateTime(2009, 1, 2, 9, 0, 0);

int workDayStart = 8;
int workDayEnd = 17;

int nonWorkHours = 0;

for (DateTime time = start; time < end; time = time.AddHours(1))
{
    if (time.Hour < workDayStart || time.Hour >= workDayEnd)
    {
        nonWorkHours++;
    }
}
DateTime start=newdatetime(2009,1,1,14,0,0);
DateTime end=新的DateTime(2009,1,2,9,0,0);
int workDayStart=8;
int workdaynd=17;
int非工作时间=0;
for(DateTime time=start;time=workdaynd)
{
非工作时间++;
}
}
最后,将其提取到一个方法中:

public static int CountNonWorkHours(DateTime start, DateTime end,
                                    int workDayStart, int workDayEnd)
{
    int nonWorkHours = 0;

    for (DateTime time = start; time < end; time = time.AddHours(1))
    {
        if (time.Hour < workDayStart || time.Hour >= workDayEnd)
        {
            nonWorkHours++;
        }
    }
    return nonWorkHours;
}
public static int countnon workhours(日期时间开始、日期时间结束、,
整数工作日开始,整数工作日结束)
{
int非工作时间=0;
for(DateTime time=start;time=workdaynd)
{
非工作时间++;
}
}
返回非工作时间;
}
编辑:关于科纳米曼的建议。。。是的,每小时循环是非常低效的。然而,这相对来说是很容易做到的。除非你要在很长的时间内做很多,否则我会使用这个相当简单的代码。如果您尝试每天执行一个版本,那么在各种情况下都很容易出现一个接一个的错误。虽然我不喜欢效率低下的代码,但如果它不伤害我的话,我也不介意:)

你把两端都算作非工作,而不是一个。这一行:

if (_Temp.Hour <= _WorkDayStart || _Temp.Hour >= _WorkDayEnd)
另一种方法是将其更改为for循环。通过所有这些更改,代码将是:

DateTime start = new DateTime(2009, 1, 1, 14, 0, 0);
DateTime end = new DateTime(2009, 1, 2, 9, 0, 0);

int workDayStart = 8;
int workDayEnd = 17;

int nonWorkHours = 0;

for (DateTime time = start; time < end; time = time.AddHours(1))
{
    if (time.Hour < workDayStart || time.Hour >= workDayEnd)
    {
        nonWorkHours++;
    }
}
DateTime start=newdatetime(2009,1,1,14,0,0);
DateTime end=新的DateTime(2009,1,2,9,0,0);
int workDayStart=8;
int workdaynd=17;
int非工作时间=0;
for(DateTime time=start;time=workdaynd)
{
非工作时间++;
}
}
最后,将其提取到一个方法中:

public static int CountNonWorkHours(DateTime start, DateTime end,
                                    int workDayStart, int workDayEnd)
{
    int nonWorkHours = 0;

    for (DateTime time = start; time < end; time = time.AddHours(1))
    {
        if (time.Hour < workDayStart || time.Hour >= workDayEnd)
        {
            nonWorkHours++;
        }
    }
    return nonWorkHours;
}
public static int countnon workhours(日期时间开始、日期时间结束、,
整数工作日开始,整数工作日结束)
{
int非工作时间=0;
for(DateTime time=start;time=workdaynd)
{
非工作时间++;
}
}
返回非工作时间;
}

编辑:关于科纳米曼的建议。。。是的,每小时循环是非常低效的。然而,这相对来说是很容易做到的。除非你要在很长的时间内做很多,否则我会使用这个相当简单的代码。如果您尝试每天执行一个版本,那么在各种情况下都很容易出现一个接一个的错误。虽然我不喜欢效率低下的代码,但如果它不伤害我,我也不介意:)

如果您计划重用此代码,我会重构它以避免循环。您可以将每天的工时乘以整天的天数,然后将间隔的第一天和最后一天视为特殊情况。

如果您计划重用此代码,我将对其进行重构以避免循环。您可以将每天的工时乘以整天的天数,然后将间隔的第一天和最后一天视为特殊情况。

您也可以使用此方法来避免循环

DateTime startDate = new DateTime(2009, 1, 1, 14, 0, 0);
            DateTime endDate = new DateTime(2009, 1, 2, 9, 0, 0);
            int startTime = 8;
            int endTime = 17;
            int ret =   ((endDate.Subtract(startDate).Days - 1) * 8) 
                        + (startDate.Hour >= startTime && startDate.Hour < endTime ? endTime - startDate.Hour : 0)
                        + (endDate.Hour > startTime && endDate.Hour <= endTime ? endDate.Hour - startTime : 0);
DateTime startDate=newdatetime(2009,1,1,14,0,0);
DateTime endDate=新的日期时间(2009,1,2,9,0,0);
int startTime=8;
int endTime=17;
int ret=((结束日期减去开始日期)天数-1)*8)
+(startDate.Hour>=startTime&startDate.Hour+(endDate.Hour>startTime&&endDate.Hour您也可以使用此选项来避免循环

DateTime startDate = new DateTime(2009, 1, 1, 14, 0, 0);
            DateTime endDate = new DateTime(2009, 1, 2, 9, 0, 0);
            int startTime = 8;
            int endTime = 17;
            int ret =   ((endDate.Subtract(startDate).Days - 1) * 8) 
                        + (startDate.Hour >= startTime && startDate.Hour < endTime ? endTime - startDate.Hour : 0)
                        + (endDate.Hour > startTime && endDate.Hour <= endTime ? endDate.Hour - startTime : 0);
DateTime startDate=newdatetime(2009,1,1,14,0,0);
DateTime endDate=新的日期时间(2009,1,2,9,0,0);
int startTime=8;
int endTime=17;
int ret=((结束日期减去开始日期)天数-1)*8)
+(startDate.Hour>=startTime&startDate.Hour+ (EndotTyth.StestTime&EndoDist.To.No,它循环次数太多,它会同时计算开始和结束。考虑5-6个周期,这是一个小时-您只想通过循环一次。我已经回答了您的建议。如果代码需要高效,基本上是正确的方法,但它是有效的。在所有情况下都需要更长的时间来确保它是正确的。(至少,对我来说是这样。)在这样的情况下,很容易错过角落案例,而“小时循环”效率低但公平