Список с датами, добавить часы в список linq

#c# #linq #list #datetime #entity

#c# #linq #Список #дата и время #сущность

Вопрос:

У меня есть список с датами, чтобы отобразить его в сетке, и я хотел бы добавить один час в диапазон 2:

 private void grid_loaded(object sender, RoutedEventArgs e)
{
    var data = new List<EntityViewModel> 
    {
        new EntityViewModel { aDay = new DateTime(1980, 1, 1, 12, 0, 12) },
        new EntityViewModel { aDay = new DateTime(1983, 1, 1, 12, 23, 12) },
        new EntityViewModel { aDay = new DateTime(1985, 6, 14, 12, 0, 12) },
        new EntityViewModel { aDay = new DateTime(1990, 7, 3, 12, 23, 12) },
        new EntityViewModel { aDay = new DateTime(1995, 8, 1, 4,  23, 12) },
        new EntityViewModel { aDay = new DateTime(1996, 1, 1, 12, 0, 12) },
        new EntityViewModel { aDay = new DateTime(2000, 1, 1, 12, 0, 12) },
        new EntityViewModel { aDay = DateTime.Now }
    };

    var range = data.Where(i => i.aDay.Year >= 1983 amp;amp; i.aDay.Year <= 1996).ToList();
    var range2 = range.Where(i => i.aDay.Date.IsDaylightSavingTime() == true).ToList();
}
  

Я пробовал это:

 var range3 = range.Where(i => i.aDay.Date.IsDaylightSavingTime() == true).ToList();
range3.ForEach(i => i.aDay.AddHours(1));
  

это:

 foreach (var item in range2.Where(x => x.aDay != null))
{
    item.aDay.AddHours(1);
}
  

и это:

 var range5 = range2.Where(i => i.aDay != null).Select(i => { i.aDay.AddHours(1); return i; }).ToList();
  

Но это ничего не делает, всегда один и тот же час.

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

1. Учитывая ваш код, я бы сказал, что добавление часа для перехода на летнее время — неправильный путь, посмотрите ToUniversalTime() вместо этого и посмотрите, делает ли он то, что вы хотите. Если это не так, посмотрите DateTimeOffset также, normal DateTime не предназначен для обработки смещений. Что IsDaylightSavingTime() делает: указывает, находится ли этот экземпляр DateTime в диапазоне перехода на летнее время для текущего часового пояса. Т.Е., даже если вы добавите час, в нем все равно будет указано, что это летнее время.

Ответ №1:

AddHours не изменяет начальную дату, но возвращает новую.
Вам нужно выбрать эти даты:

 var range5 = range2.Where(i => i.aDay != null).Select(i => i.aDay.AddHours(1));
  

Чтобы получить измененные даты или

 range3.ForEach(i => i.aDay = i.aDay.AddHours(1));
  

Чтобы изменить даты элементов в списке.

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

1. А если я хочу убрать значение?

2. Если вы хотите вычесть час: i.aDay.AddHours(-1)

Ответ №2:

DateTime это структура, поэтому вам нужно сделать: var date = DateTime.Now;
date = date.AddHours(1);

в вашем случае: range3.ForEach(i => i.aDay = i.aDay.AddHours(1));

Ответ №3:

AddHours возвращает новую дату и время, она не изменяет текущий экземпляр. http://msdn.microsoft.com/en-us/library/system.datetime.addhours.aspx

 for (int i = 0; i < range2.Count;   i) {
    range2[i].aDay = range2[i].aDay.AddHours(1);
}