DateTime Сбрасывает в полночь - PullRequest
0 голосов
/ 06 ноября 2018

Привет, я использую веб-приложение C # на visual studio.

Я написал код, чтобы можно было различать, если время находится между 6am-2pm - 2pm-10pm и 10pm - 6am ...

Код работает как сон для 6-2 - 2-10 раз, но для 10 вечера - 6 утра ... код работает нормально до полуночи, а затем просто сбрасывает мой счетчик на 0 и остается от 0 до 6 утра ... Я не могу понять, почему это происходит .. У кого-нибудь есть решение ..

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:00 - 6:00, а затем полностью останавливается в полночь.

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 голосов
/ 06 ноября 2018

Ошибка заключается в добавлении часов к текущему дню ...

Shiftstart = now.Date.AddHours(shiftHourStart);

В 23:59 вы добавляете 22 часа к «2018-11-06».

Проходит одна минута ...

В 00:00 вы добавляете 22 часа к «2018-11-07».

Это означает, что ваше начальное время меняется на 24 часа в течение этой одной минуты.

Вы можете выделить этот сценарий как часть вашего оператора if. См. Комментарии а) и б) ниже.

        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;
        }
0 голосов
/ 06 ноября 2018

Сначала сохраните свое время в 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, в котором я создаю все часы дня (с 00 до 23 часов), чтобы вы могли легко видеть, что происходит.

0 голосов
/ 06 ноября 2018

Вы должны различать currentHour от 0 до 5 и currentHour от 22 до 23.

Например, рассмотрим currentHour, равное 1. Ваши расчеты говорят, что смена начинается в 22:00 текущего дня (now.Date.AddHours(22)), что, очевидно, неправильно, поскольку смена уже началась в 22:00 предыдущего день.

Таким образом, из currentHour 0 до 5 вы должны вычесть день из вашего Shiftstart.


Один из возможных способов сделать это - установить shiftHourStart в -2 для currentHour в диапазоне от 0 до 5.

if (currentHour < 6)
{
    shiftHourStart = -2;
}
else if (currentHour >= 6 && currentHour <= 13) 
{
    shiftHourStart = 6;
}
else if  (currentHour >= 14 && currentHour <= 21)
{
    shiftHourStart = 14;
}
else 
{
    shiftHourStart = 22;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...