Роман Иванов

Работа в c# с DateTime - получение набора дат в текущем году

2 сообщения в этой теме

Реализовывая как то механизм получения всех дат для заданного дня недели определенного года для выстраивания их на виртуальном календаре при сравнении со сторонним списком дат, наткнулся на очень интересный (как по мне) вариант реализации схожей задачи (немного переделал для своих нужд):

 

  1. class DataWorker  
  2. {  
  3.    public IEnumerable<datetime> GetAllDates(int year,   
  4.       DayOfWeek dayOfWeek)  
  5.    {  
  6.       DateTime date;  
  7.   
  8.       for (int i = 1; i <= 12; i++)  
  9.       {  
  10.          date = new DateTime(year, i, 1);  
  11.               
  12.          var dates = Enumerable.Range  
  13.          (  
  14.              1,DateTime.DaysInMonth(date.Year,date.Month)).  
  15.              Select(tempDay => new DateTime(  
  16.                  date.Year, date.Month, tempDay)  
  17.          );  
  18.               
  19.          foreach (var item in dates)  
  20.              if (item.DayOfWeek == dayOfWeek)  
  21.                  yield return item;  
  22.       }  
  23.    }  
  24. }  
  25. </datetime>  

 

Для получения всех дат, соответствующих определенному (к примеру среда) дню недели в каждом месяце текущего года вызываем метод GetAllDates:

 

  1. var dates = wdt.GetAllDates(2010, DayOfWeek.Wednesday);  

 

Получив список, реализовывающий интерфейс IEnumerable, не составляет особого труда перебрать все его элементы. Ну к примеру хотя бы так:

 

  1. foreach (var dat in dates)  
  2.    Console.WriteLine(dat.ToString());  

 

Для тех, кто впервые сталкивается с лямбда выражениями скажу, что хотя далеко не все программеры применяют их для подобных целей (и не только), все таки полезно познакомиться с их принципом работы и приемами составления.

Обещаю в скором времени познакомить вас с синтаксисом лямбда выражений, а пока для начала метод GetAllDates перепишем с более глубоким использованием лямбда выражений (пример кода тоже не мой, но очень уж понравился изящностью исполнения):

 

  1. public IEnumerable<datetime> GetAllDates(int year,   
  2.     DayOfWeek weekDay)  
  3. {  
  4.     return Enumerable.Range(1, 12)  
  5.         .Select(month => new DateTime(year, month, 1))  
  6.         .Select(date => Enumerable.Range(  
  7.             1, DateTime.DaysInMonth(date.Year, date.Month))  
  8.         .Select(day => new DateTime(date.Year, date.Month, day))  
  9.         .Where(thisDay => thisDay.DayOfWeek == weekDay))  
  10.         .SelectMany(d => d);  
  11. }  
  12. </datetime>  

 

Вызов данного метода ничем не отличается от предыдущего:

 

  1. var dates = wdt.GetAllDates(2010, DayOfWeek.Wednesday);  

 

Тут же попутно, если требуется получить все месяцы в году:

 

  1. System.Globalization.DateTimeFormatInfo dtformatInfo =   
  2.     new System.Globalization.DateTimeFormatInfo();  
  3.   
  4. for(int i = 1; i <= 12; i++)  
  5.     Console.WriteLine(dtformatInfo.GetMonthName(i));  

 

Если требуется проверить содержимое объекта на реальность даты, то:

 

  1. //создается на случай успешного приведения в методе TryParse  
  2. DateTime errorvalue = new DateTime();  
  3.   
  4. Console.WriteLine(DateTime.TryParse(  
  5.     string.Format("{0} {1} {2}", DateTime.Now.Year,   
  6.     DateTime.Now.Month, DateTime.Now.Day), out errorvalue));  
1 пользователю понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зареєструвати аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

Яндекс.Метрика Рейтинг@Mail.ru Индекс цитирования