日期时间在午夜重置

时间:2018-11-06 08:37:13

标签: c# datetime

嗨,我正在Visual Studio中使用C#网络应用程序。

我编写了代码,以区分时间是否在6am-2pm-2pm-10pm10pm - 6am之间。

代码像梦一样运行了6-2-2-10次,但是运行了10pm-6am ..代码运行良好,直到午夜,然后才将我的计数器重置为0,并保持为0,直到6am。我无法理解为什么这样做。有人解决方案吗?

public DateTime Shiftstart { get; set; }

public DateTime Shiftend { get; set; }

public string Itemseriesmaster { get; set; }

public string SeriesMasterId { get; set; }

public void CalcShiftPeriod() //constructor
{
    DateTime now = DateTime.Now; //date time now
    int currentHour = now.Hour; //hour now
    int shiftHourStart;

    if (currentHour >= 6 && currentHour <= 13) 
    {
        shiftHourStart = 6;
    }
    else if  (currentHour >= 14 && currentHour <= 21)
    {
        shiftHourStart = 14;
    }
    else 
    {
        shiftHourStart = 22;
    }


    Shiftstart = now.Date.AddHours(shiftHourStart);
    Shiftend = Shiftstart.AddHours(7);
    Shiftend = Shiftend.AddMinutes(59);
    Shiftend = Shiftend.AddSeconds(59);
}

该代码正在计算包​​装的总单位数,并且可以正常工作,并在给定时间后以6-2和2-10班次重置。.

直到晚上10点至凌晨6点,然后在午夜完全停止。

BizManager biz = new BizManager();

                    DataTable dt = new DataTable();

                    if (DDLProduct.SelectedValue.Equals("G120C-2") || DDLProduct.SelectedValue.Equals("G120 PM240-2") )
                    {
                        RefreshMainGridTht(selectedProduct, shiftStart, shiftEnd
                           );
                    }
                    dt = biz.GetPacktstatisticsForShift(shiftStart, shiftEnd, selectedProduct);

                    GridView1.DataSource = dt.DefaultView;
                    GridView1.DataBind();

                    int sumActual = 0;
                    int sumTarget = 0;


                    biz.CalculatePackingTotals(dt, out sumActual, out sumTarget);
                    LabelTotal.Text = sumActual.ToString();



                    DateTime dtmNow = DateTime.Now;
                    TimeSpan tsIntoShift = dtmNow - shiftStart;
                    TimeSpan tsTotalShift = shiftEnd - shiftStart;

                    double p = tsIntoShift.TotalMinutes / tsTotalShift.TotalMinutes;

                    int adjustedTarget = Convert.ToInt32(sumTarget * p);

                    if (sumActual > sumTarget)
                    {
                        LabelTotal.ForeColor = Color.Lime;
                    }
                    else
                    {
                        LabelTotal.ForeColor = Color.Red;
                    }
                }
                catch (Exception ex)
                {
                    ErrMsg = App.HandleError(MethodBase.GetCurrentMethod(), ex, string.Empty);

3 个答案:

答案 0 :(得分:1)

您必须区分myprogram input.txt 从0到5和currentHour从22到23。

例如,假设currentHour是1。您的计算表明,该轮班从当日(currentHour)的22:00开始,这显然是错误的,因为该轮班已经从22开始:前一天的00。

因此,从now.Date.AddHours(22) 0到5,您必须从currentHour中减去一天。


一种可行的方法是将Shiftstart的{​​{1}}设置为shiftHourStart到0到5之间。

-2

答案 1 :(得分:0)

错误在于将小时数添加到当天...

Shiftstart = now.Date.AddHours(shiftHourStart);

在23:59,您将为“ 2018-11-06”增加22个小时。

一分钟过去了...

在00:00,您将为“ 2018-11-07”增加22小时。

这意味着您的开始时间在那一分钟内移动了24小时。

您可以将此情况作为if语句的一部分进行区分。请参阅下面的注释a)和b)。

        int currentHour = now.Hour;
        DateTime date = now.Date; // a) This is today in most cases...

        int shiftHourStart;

        if (currentHour >= 6 && currentHour <= 13)
        {
            shiftHourStart = 6;
        }
        else if (currentHour >= 14 && currentHour <= 21)
        {
            shiftHourStart = 14;
        }
        else if (currentHour >= 22)
        {
            shiftHourStart = 22;
        }
        else
        {
            // midnight to 6am
            date = date.AddDays(-1); // b) But not in this case
            shiftHourStart = 22;
        }

答案 2 :(得分:0)

首先将您的时间存储在TimeSpan中,这将在明天轮班开始和结束于30分钟时为您提供更大的灵活性。然后将那些Timespan存储在代表时间范围的类中。如果您有它们的列表,请使其成为列表。这将有助于阅读和维护您的代码。目前,这是一个神奇的数字早午餐。

要检查时间是否在范围内,我使用了:

public static bool IsBetween(TimeSpan time, TimeSpan start, TimeSpan end)
    => (start <= end) ? time >= start && time <= end : time >= start || time <= end;


internal void TestMethod()
{
    var timeSlots = new[] {
        new TimeFrame { start= new TimeSpan(6,0,0) , end = new TimeSpan(13,0,0) },
        new TimeFrame { start= new TimeSpan(14,0,0) , end = new TimeSpan(21,0,0) },
        new TimeFrame { start= new TimeSpan(22,0,0) , end = new TimeSpan(6,0,0) }
    };

    var today = DateTime.Today;
    var dayHours = Enumerable.Range(0, 24).Select(x => today.AddHours(x)).ToList();

    foreach (var currentDateTime in dayHours)
    {
        var matchingRanges = timeSlots.Where(x => IsBetween(currentDateTime .TimeOfDay, x.start, x.end));
        if (matchingRanges.Any())
        {
            var temp = matchingRanges.First();
            Console.WriteLine($"-> {currentDateTime } is in range {temp.start}-{temp.end}");                
            Console.WriteLine($"\t ShiftHours= {temp.start}-{temp.end.Subtract(new TimeSpan(0, 0, 1))}");
        }
        else
        {
            Console.WriteLine($"no Match for {currentDateTime }");
        }
    }
}

您添加了关于在午夜进行测试的评论,其中包括一个TestMethod,我可以在其中创建一天中的所有小时(从00h到23h),以便您轻松查看正在发生的情况。

相关问题