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