所以你想获得 2 个 DateTime 之间的差异 (TimeSpan),但忽略周日。
这是我的最小可重现示例:
using System;
public class Program
{
public static void Main(string[] args)
{
DateTime dt1 = Convert.ToDateTime(args[0]);
DateTime dt2 = Convert.ToDateTime(args[1]);
TimeSpan x = dt2-dt1;
double hours = x.TotalHours;
int numOfWeek = (int)Math.Floor(x.TotalDays/7);
hours = hours - (numOfWeek * 24);
// if difference is more than 1 week, then subtract hours with week difference
DayOfWeek dt1_dow = dt1.DayOfWeek; // System.DayOfWeek is enum, 0=Sunday, 1=Monday, etc
DayOfWeek dt2_dow = dt2.DayOfWeek; // System.DayOfWeek is enum, 0=Sunday, 1=Monday, etc
if( (int)dt1_dow > (int)dt2_dow )
{
hours = hours - 24;
}
// if dt1's day of week is higher than dt2's day of week, then we can be sure that it go over one Sunday
Console.WriteLine(numOfWeek);
Console.WriteLine(hours);
}
}
您可以使用https://dotnetfiddle.net/ 或自己编译为控制台应用程序(在Visual Studio 中)或将其保存为file.cs 文本文件,然后在Linux 中使用rm file.exe ; csc file.cs ; mono file.exe '2021-11-05 03:00:00' '2021-11-10 03:00:00' 进行单声道编译
测试:
$ cal
November 2021
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
测试用例:
$ mono a.exe '2021-11-05 03:00:00' '2021-11-10 03:00:00'
0
96
- 日期 5 到 10:过了星期日,不超过 1 周,结果是 96 小时(正确,因为不计算星期日是 4 天)
$ mono a.exe '2021-11-03 03:00:00' '2021-11-05 03:00:00'
0
48
- 日期 3 到 5:不超过星期日,不超过 1 周,结果为 48 小时(正确,因为是 2 天)
$ mono a.exe '2021-11-03 03:00:00' '2021-11-15 03:00:00'
1
240
- 日期 3 到 15:不超过星期天,超过 1 周,导致 240 小时(正确,因为不计算星期天是 10 天)
所以在你的代码中:
mydt1 = Convert.ToDateTime(dt.Rows[0].ItemArray[7].ToString());
DateTime dt2 = DateTime.Now;
var hours = (dt2 - mydt1).TotalHours;
// start adding code
int numOfWeek = (int)Math.Floor(x.TotalDays/7);
hours = hours - (numOfWeek * 24);
DayOfWeek dt1_dow = dt1.DayOfWeek;
DayOfWeek dt2_dow = dt2.DayOfWeek;
if( (int)dt1_dow > (int)dt2_dow )
{
hours = hours - 24;
}
// end adding code
if (hours >= 0) {
txtElapse.Text = hours.ToString("0");
var totals = hours * 2;
txtFine.Text = totals.ToString("0");
} else {
txtFine.Text = "0";
txtElapse.Text = "0";
}