Рассчитайте количество часов в 2 разных дня, исключая воскресенье

#c# #datetime

Вопрос:

  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";
 }
 

Я создаю библиотечную систему, и я работаю над этим. Тем не менее, я хочу исключить каждое воскресенье, которое проходит в промежутке времени. Я не знаю, как я мог бы это сделать или какую логику я могу использовать.

Комментарии:

1. DateTime .DayOfWeek свойство может вам помочь.

2. я думаю об этом, но я все еще не знаю, как я могу это использовать.

3. Не могли бы вы, пожалуйста, предоставить сообществу дополнительную информацию? Входные данные и выходные данные. На что это должно быть похоже? (например, покажите пример данных, которого вы хотите достичь, показав нам пример, который иллюстрирует это более точно)

4. например, mydt1 = 30/10/2021 11: 00 утра и dt2 = 01/11/2021 11:00 утра, и результат будет составлять всего 24 часа. и я просто умножаю это на 2, потому что политика в библиотеке такова: 2 песо (валюта в ph) в час.

Ответ №1:

Итак, вы хотите получить разницу (промежуток времени) между 2 датами и временем, но игнорируете воскресенье.

Вот мой минимально воспроизводимый пример:

 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 текстовый файл, а затем скомпилируйте с mono в 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";
 }