.net 取时间差 去掉周末及非工作时间
时间: 2023-08-15 19:05:53 浏览: 162
要计算时间差并排除周末及非工作时间,可以使用以下步骤:
1. 使用TimeSpan类计算两个日期之间的时间差。
2. 排除周末的时间,可以使用Weekday属性,Weekday返回0表示星期日,1表示星期一,以此类推。如果时间差的天数是7的倍数,则排除的时间应该为2倍的周末时间。
3. 排除非工作时间的时间,可以定义一个非工作时间段的时间区间,然后将时间差中与非工作时间段重叠的部分排除。
4. 排除节假日的时间,可以使用自定义函数或第三方库,将日期表与节假日表JOIN,然后排除在节假日表中出现的日期。
下面是一个示例代码,假设要计算2021年1月1日到2021年1月31日之间的工作时间:
```
DateTime start = new DateTime(2021, 1, 1, 9, 0, 0); // 开始时间
DateTime end = new DateTime(2021, 1, 31, 18, 0, 0); // 结束时间
TimeSpan span = end - start; // 计算时间差
int totalDays = (int)Math.Ceiling(span.TotalDays); // 计算总天数
int weekendDays = 0; // 周末天数
for (int i = 0; i < totalDays; i++) {
DateTime date = start.AddDays(i);
if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday) {
weekendDays++;
}
}
if (totalDays % 7 == 0) {
weekendDays *= 2;
}
TimeSpan offHours = new TimeSpan(9, 0, 0) - new TimeSpan(18, 0, 0); // 定义非工作时间段
TimeSpan offTime = new TimeSpan(0); // 非工作时间
for (int i = 0; i < totalDays; i++) {
DateTime date = start.AddDays(i);
TimeSpan startTime = date.Date + new TimeSpan(9, 0, 0);
TimeSpan endTime = date.Date + new TimeSpan(18, 0, 0);
if (span.Overlap(startTime, endTime)) {
offTime += span.Intersect(startTime, endTime);
}
}
TimeSpan holidayTime = new TimeSpan(0); // 节假日时间
foreach (DateTime date in holidayList) { // holidayList是节假日列表
if (date >= start && date <= end) {
holidayTime += new TimeSpan(1, 0, 0, 0);
}
}
TimeSpan workTime = span - new TimeSpan(weekendDays, 0, 0, 0) - offTime - holidayTime; // 计算工作时间
```
其中,holidayList是一个包含所有节假日日期的列表。代码中使用了Overlap和Intersect方法来判断时间段是否重叠,使用了Ceiling方法来向上取整天数。最终的workTime变量即为实际的工作时间。
阅读全文