获取startdate到enddate之间的时长,剔除8-12 14-18这2个时间段。返回总秒
/// <summary>
/// 获取startdate到enddate之间的时长,剔除8-12 14-18这2个时间段。返回总秒
/// </summary>
/// <param name="startdate"></param>
/// <param name="enddate"></param>
/// <returns></returns>
public static string getShiChang(string startdate, string enddate)
{
DateTime startTime = Convert.ToDateTime(startdate);
DateTime endTime = Convert.ToDateTime(enddate);
TimeSpan ts = new TimeSpan();
double shichang = 0;
double shichang1 = 0;
double shichang2 = 0;
double shichang3 = 0;
//如果是周六周天,则所有时间都是有效时间
if (startTime.DayOfWeek.ToString("d") == "0" || startTime.DayOfWeek.ToString("d") == "6")
{
ts = endTime - startTime;
shichang1 = ts.TotalSeconds;
}
else
{
DateTime sys_startdate = Convert.ToDateTime(startTime.ToString("yyyy-MM-dd") + " " + "8:0:0");
DateTime sys_enddate = Convert.ToDateTime(endTime.ToString("yyyy-MM-dd") + " " + "12:0:0");
DateTime sys_startdate2 = Convert.ToDateTime(startTime.ToString("yyyy-MM-dd") + " " + "14:0:0");
DateTime sys_enddate2 = Convert.ToDateTime(endTime.ToString("yyyy-MM-dd") + " " + "18:0:0");
if (sys_startdate.CompareTo(startTime) == 1) //开始时间早于8点 7:00
{
if (sys_startdate.CompareTo(endTime) == 1)//结束时间早于8点
{
ts = endTime - startTime;
shichang1 = ts.TotalSeconds;
}
else if (sys_enddate.CompareTo(endTime) == 1) //结束时间早于12点
{
ts = sys_startdate - startTime;
shichang1 = ts.TotalSeconds;
}
else if (sys_startdate2.CompareTo(endTime) == 1)//结束时间早于14点
{
ts = endTime - sys_enddate;
shichang1 = ts.TotalSeconds;
ts = sys_startdate - startTime;
shichang2 = ts.TotalSeconds;
}
else if (sys_enddate2.CompareTo(endTime) == 1)//结束时间早于18点
{
ts = sys_startdate2 - sys_enddate;
shichang1 = ts.TotalSeconds;
ts = sys_startdate - startTime;
shichang2 = ts.TotalSeconds;
}
else
{
ts = endTime - sys_enddate2;
shichang1 = ts.TotalSeconds;
ts = sys_startdate2 - sys_enddate;
shichang2 = ts.TotalSeconds;
ts = sys_startdate - startTime;
shichang3 = ts.TotalSeconds;
}
}
else if (sys_enddate.CompareTo(startTime) == 1) //开始时间处于8:00-12点
{
if (sys_enddate.CompareTo(endTime) == 1)//结束时间处于8-12点,不计时
{
shichang1 = 0;
}
else if (sys_startdate2.CompareTo(endTime) == 1)//结束时间早于14点 则时长
{
ts = endTime - sys_enddate;
shichang1 = ts.TotalSeconds;
}
else if (sys_enddate2.CompareTo(endTime) == 1)//结束时间早于18点
{
ts = sys_startdate2 - sys_enddate;
shichang1 = ts.TotalSeconds;
}
else
{
ts = endTime - sys_enddate2;
shichang1 = ts.TotalSeconds;
ts = sys_startdate2 - sys_enddate;
shichang2 = ts.TotalSeconds;
}
}
else if (sys_startdate2.CompareTo(startTime) == 1)//开始时间处于12:00-14:00
{
if (sys_startdate2.CompareTo(endTime) == 1)//结束时间处于12-14点
{
ts = endTime - startTime;
shichang1 = ts.TotalSeconds;
}
else if (sys_enddate2.CompareTo(endTime) == 1)//结束时间早于14-18点 则时长
{
ts = sys_startdate2 - startTime;
shichang1 = ts.TotalSeconds;
}
else
{
ts = endTime - sys_enddate2;
shichang1 = ts.TotalSeconds;
ts = sys_startdate2 - startTime;
shichang2 = ts.TotalSeconds;
}
}
else if (sys_enddate2.CompareTo(startTime) == 1)//开始时间处于14:00-18:00
{
if (sys_enddate2.CompareTo(endTime) == 1)//结束时间处于14-18点
{
shichang1 = 0;
}
else //结束时间处于18-24
{
ts = endTime - sys_enddate2;
shichang1 = ts.TotalSeconds;
}
}
else //开始时间处于18:00-24:00
{
ts = endTime - startTime;
shichang1 = ts.TotalSeconds;
}
}
shichang = shichang1 + shichang2 + shichang3;
if (shichang < 300) shichang = 0;
return shichang.ToString();
}
private static TimeSpan t4 = TimeSpan.FromHours(18);
private static TimeSpan t3 = TimeSpan.FromHours(14);
private static TimeSpan t2 = TimeSpan.FromHours(12);
private static TimeSpan t1 = TimeSpan.FromHours(8);
private static double getShiChang(DateTime dateTime1, DateTime dateTime2)
{
var result = 0D;
begin:
if (dateTime1 >= dateTime2)
return result;
var wk = dateTime1.DayOfWeek;
var dt = dateTime1.Date;
var tm = dateTime1.TimeOfDay;
if (wk == DayOfWeek.Saturday)
{
var mo = dt.AddDays(2).Add(t1);
result += mo.Subtract(dateTime1).TotalSeconds;
dateTime1 = mo;
}
else if (wk == DayOfWeek.Sunday
[解决办法]
tm >= t4)
{
var mo = dt.AddDays(1).Add(t1);
result += mo.Subtract(dateTime1).TotalSeconds;
dateTime1 = mo;
}
else if (tm >= t3)
dateTime1 = dt.Add(t4);
else if (tm >= t2)
{
result += tm.Subtract(t2).TotalSeconds;
dateTime1 = dt.Add(t4);
}
else if (tm >= t1)
dateTime1 = dt.Add(t2);
else
{
result += t1.Subtract(tm).TotalSeconds;
dateTime1 = dt.Add(t2);
}
goto begin;
}
public long getShiChang(DateTime startdate, DateTime enddate)
{
long res = 0;
TimeSpan ts24 = TimeSpan.Parse("1.00:00:00");
TimeSpan[] ts = new TimeSpan[]{
TimeSpan.Parse("00:00"), TimeSpan.Parse("08:00"),
TimeSpan.Parse("12:00"), TimeSpan.Parse("14:00"),
TimeSpan.Parse("18:00"), ts24,
};
for (; startdate < enddate; startdate = startdate.Date.AddDays(1))
{
TimeSpan ts0 = startdate.TimeOfDay;
TimeSpan ts1 = (startdate.Date.Equals(enddate.Date)) ? enddate.TimeOfDay : ts24;
for (int i = 0; i < ts.Length; i += 2)
{
if (ts0 < ts[i + 1] && ts1 > ts[i])
{
TimeSpan tsa = ts0 < ts[i] ? ts[i] : ts0;
TimeSpan tsb = ts1 > ts[i + 1] ? ts[i + 1] : ts1;
res += (long)(tsb - tsa).TotalSeconds;
}
}
}
return res;
}