我知道这个问题很多时候都被问过,但是我的问题很小。 工作中有许多不同的变化,我有两个字符串 shiftStart 和 shiftEnd 。 (例如“6:00:00 PM”&“03:00:00 AM”)。这代表中午到早上。 我正在尝试创建一个函数,告诉我DateTime.Now是否在此时间段内。
注意: 班次可以是任何 ...从早到中午,中午到早上,没有固定时间(如8小时)
static bool NowWithinShiftTime("6:00:00 PM", "03:00:00 AM")
以下是我的尝试,但无论我做什么,我似乎无法找到逻辑...... 请帮帮我...
static bool NowWithinShiftTime(string shiftStart, string shiftEnd)
{
DateTime startDate;
DateTime endDate;
DateTime now = DateTime.Now;
TimeSpan startTime = DateTime.Parse(shiftStart).TimeOfDay;
TimeSpan endTime = DateTime.Parse(shiftEnd).TimeOfDay;
if (startTime < endTime) // same day
{
startDate = new DateTime(now.Year, now.Month, now.Day) + startTime;
endDate = new DateTime(now.Year, now.Month, now.Day) + endTime;
}
else // next day
{
startDate = new DateTime(now.Year, now.Month, now.AddDays(-1).Hour) + startTime;
endDate = DateTime.Today.AddDays(1) + endTime;
}
if (now >= startDate && now <= endDate)
{
return true;
}
else
{
return false;
}
}
答案 0 :(得分:5)
你可以坚持使用TimeSpan
:
static bool NowWithinShiftTime(string shiftStart, string shiftEnd)
{
TimeSpan startTime = DateTime.Parse(shiftStart).TimeOfDay;
TimeSpan endTime = DateTime.Parse(shiftEnd).TimeOfDay;
TimeSpan now = DateTime.Now.TimeOfDay;
if (startTime < endTime)
return now >= startTime && now <= endTime;
else
return now >= startTime || now <= endTime;
}
答案 1 :(得分:5)
首先,使所有业务逻辑仅与时间相关的类型进行交易。 (我个人使用我的Noda Time库及其LocalTime
类型来完成这项工作,但是...)解析可以在调用代码中进行。
逻辑相当简单:如果“结束时间”实际上在“开始时间”之前,则只需切换两轮并反转结果。毕竟,你只是把这一天划分为“轮班时间”和“不换班时间”......每当凌晨3点到晚上8点的班次“关闭”时,(比方说)晚上8点到凌晨3点的班次都会“开启”。
例如:
public bool NowWithinShiftTime(TimeSpan startTimeOfDay, TimeSpan endTimeOfDay)
{
if (startTimeOfDay > endTimeOfDay)
{
return !NowWithinShiftTime(endTimeOfDay, startTimeOfDay);
}
TimeSpan now = DateTime.Now.TimeOfDay;
return startTimeOfDay <= now && now < endTimeOfDay;
}
注意:
FakeClock
。)答案 2 :(得分:1)
我相信你在那里90%:
static bool NowWithinShiftTime(string shiftStart, string shiftEnd)
{
DateTime startDate;
DateTime endDate;
DateTime now = DateTime.Now;
TimeSpan startTime = DateTime.Parse(shiftStart).TimeOfDay;
TimeSpan endTime = DateTime.Parse(shiftEnd).TimeOfDay;
if (startTime < endTime) // same day
{
startDate = DateTime.Today + startTime;
endDate = DateTime.Today + endTime;
}
else // next day
{
startDate = DateTime.Today + startTime;
endDate = DateTime.Today.AddDays(1) + endTime;
}
if (now >= startDate && now <= endDate)
{
return true;
}
else
{
return false;
}
}
这是一个显示它有用的想法:http://ideone.com/rdb867
答案 3 :(得分:1)
这应该有效
static bool NowWithinShiftTime(string shiftStart, string shiftEnd)
{
DateTime now = DateTime.Now;
DateTime startDate = DateTime.Parse(shiftStart);
DateTime endDate = DateTime.Parse(shiftEnd);
if (endDate < startDate)
{
endDate = endDate.AddDays(1);
}
return now >= startDate && now <= endDate;
}
答案 4 :(得分:0)
这应该有效:
bool IsWithinTimeRange(DateTime dateToCompare, DateTime startDate, DateTime endDate)
{
TimeSpan timeToCompare = dateToCompare.TimeOfDay;
TimeSpan start = startDate.TimeOfDay;
TimeSpan end = endDate.TimeOfDay;
if (start < end)
return timeToCompare >= start && timeToCompare <= end;
else
return !(end < timeToCompare && timeToCompare < start);
}