Итерация через часы в день

74
9

с переменной DateTime, например:


DateTime testDate = new DateTime(2011,12,15,00,00,00);

как я могу реализовать цикл foreach для каждого часа этого дня?


Что-то вроде:


foreach (int myHour in testDate.Date)
{

}


но таким образом не компилируется.

спросил(а) 2021-01-14T00:10:50+03:00 1 неделя назад
1
Решение
163

Это не очень хорошая идея для цикла 24, потому что это не будет работать в дни с 25 или 23 часами (изменение времени, переход на летнее время...).


Используйте функцию AddHour и целевую дату.


DateTime testDate = new DateTime(2011, 12, 15, 00, 00, 00, DateTimeKind.Local);
DateTime endDate = testDate.AddDays(1);

while (testDate.Date != endDate.Date)
{
Console.WriteLine(testDate.ToString());
testDate = testDate.AddHours(1);
}

Дополнительная информация


ответил(а) 2021-01-14T00:10:50+03:00 1 неделя назад
111

Вместо этого используйте for:


DateTime date = new DateTime(2011,12,15);
for(int i = 0; i < 24; i++)
{
DateTime time = date.AddHours(i);
...
}

Если вы действительно хотите использовать foreach, вы можете создать метод расширения следующим образом:


static class DateTimeExtensions
{
public static IEnumerable<DateTime> GetHours(this DateTime date)
{
date = date.Date; // truncate hours
for(int i = 0; i < 24; i++)
{
yield return date.AddHours(i);
}
}
}

...

DateTime date = new DateTime(2011,12,15);
foreach (DateTime time in date.GetHours())
{
...
}

ответил(а) 2021-01-14T00:10:50+03:00 1 неделя назад
60

foreach loop работает в списке, но здесь testDate.Date никогда не дает вам час. поэтому взамен его использовать для цикла или делать while или while цикл.

ответил(а) 2021-01-14T00:10:50+03:00 1 неделя назад
59

Для тех, кому не нравится простой старый для циклов:):


DateTime testDate = new DateTime(2011,12,15,00,00,00);
foreach (int hour in Enumerable.Range(0,24)) {
DateTime dateWithHour = testDate.AddHours(hour);
}

ответил(а) 2021-01-14T00:10:50+03:00 1 неделя назад
61

В приведенном ниже коде вы можете переходить в часовое время суток, но также начиная с определенного часа. Это может быть проще, если вам не нужно начинать с смещения часа.


DateTime testDate = new DateTime(2011,12,15,13,00,00);
var hoursLeft = 24 - testDate.Hour;

for (var hour = 1; hour < hoursLeft; hour++)
{
var nextDate = testDate.AddHours(hour);
Console.WriteLine(nextDate);
}

ответил(а) 2021-01-14T00:10:50+03:00 1 неделя назад
43

Итерируйте в течение 24 часов дня:


DateTime testDate = new DateTime(2011, 12, 15);

for (int i = 0; i < 24; i++)
{
DateTime hour = testDate.Date.AddHours(i);
// Your code here
}

ответил(а) 2021-01-14T00:10:50+03:00 1 неделя назад
43

DateTime today = DateTime.Today;
DateTime tomorrow = today.AddDays(1);
for ( var i = today; i <= tomorrow; i = i.AddHours(1))
{
// your code
}

ответил(а) 2021-01-14T00:10:50+03:00 1 неделя назад
42

Чтобы получить часы в DLS, используйте это:


DateTime testDate = new DateTime(2017, 03, 26, 00, 00, 00, DateTimeKind.Local);
DateTime endDate = testDate.AddDays(1);

//these dates also contain time!
var start = TimeZone.CurrentTimeZone.GetDaylightChanges(testDate.Year).Start;
var end = TimeZone.CurrentTimeZone.GetDaylightChanges(testDate.Year).End;

var hoursInDay = new List<DateTime>();

while (testDate.Date != endDate.Date)
{
if (start == testDate)
{
//this day have 23 hours, and should skip this hour.
testDate = testDate.AddHours(1);
continue;
}

hoursInDay.Add(testDate);

if (end == testDate)
{
hoursInDay.Add(testDate); //this day has 25 hours. add this extra hour
}

testDate = testDate.AddHours(1);
}


Я в Дании, поэтому, когда я запускаю это, у него есть только 23 часа.

ответил(а) 2021-01-14T00:10:50+03:00 1 неделя назад
-4

просто выполните это


DateTime testDate = new DateTime(2011, 12, 15, 10, 00, 00);
for (int i = testDate.Hour; i < 24; i++)
{
//do what ever

}

ответил(а) 2021-01-14T00:10:50+03:00 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема