【问题标题】:Calculate the hours in 2 different days excluding the sunday计算除星期日外 2 天的小时数
【发布时间】:2021-11-01 03:12:58
【问题描述】:
 mydt1 = Convert.ToDateTime(dt.Rows[0].ItemArray[7].ToString());

 DateTime dt2 = DateTime.Now;

 var hours = (dt2 - mydt1).TotalHours;

 if (hours >= 0) {
   txtElapse.Text = hours.ToString("0");
   var totals = hours * 2;

   txtFine.Text = totals.ToString("0");
 } else {
   txtFine.Text = "0";
   txtElapse.Text = "0";
 }

我正在创建一个图书馆系统,我正在努力。但是,我想排除在时间跨度上过去的每个星期日。我不知道我该怎么做或我可以使用什么逻辑。

【问题讨论】:

  • DateTime.DayOfWeek 属性可能会对您有所帮助。
  • 我在想它,但我仍然不知道我该如何使用它。
  • 能否向社区提供更多信息?输入数据和输出。它应该是什么? (例如,通过向我们展示一个更准确地说明它的示例来展示您希望实现的数据示例)
  • 例如 mydt1 = 30/10/2021 11:00 am 和 dt2 = 01/11/2021 11:00 am,输出将只有 24 小时。我只是将它乘以 2,因为图书馆的政策是每小时 2 比索(ph 值的货币)。

标签: c# datetime


【解决方案1】:

所以你想获得 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";
 }

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多