嗨,我正在Visual Studio中使用C#网络应用程序。
我编写了代码,以区分时间是否在6am-2pm
-2pm-10pm
和10pm - 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);
答案 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),以便您轻松查看正在发生的情况。