2010-05-17 2 views
0

В C# я хочу показать первую неделю в календаре (в таблице html), и я пытаюсь найти самый элегантный алгоритм для создания правильного дней.Что является самым элегантным способом показа первой недели в месяце

Если в первый день недели не воскресенье, я хочу показать дни предыдущего месяца (например, вы увидите в обычном календаре). Итак, в качестве ввода у вас есть текущий месяц. В этом случае май. Я хочу, чтобы генерировать это:

Месяц: Май

<table> 
<tr> 
    <th>S</th> 
    <th>M</th> 
    <th>T</th> 
    <th>W</th> 
    <th>TH</th> 
    <th>F</th> 
    <th>Sa</th> 
</tr> 
<tr> 
    <td>25</td> 
    <td>26</td> 
    <td>27</td> 
    <td>28</td> 
    <td>29</td> 
    <td>30</td> 
    <td>1</td> 
</tr></table> 

поэтому он должен показать что-то вроде этого (игнорировать выравнивание)

S | M | T | W | Th | F | Sa |
25 - 26 - 27 - 28 - 29 - 30 - 1

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

Я генерирую эту таблицу на C# на своем сервере, чтобы перейти на страницу html.

ответ

3

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

public static IEnumerable<DateTime> GetFirstWeek(int year, int month) { 
    DateTime firstDay = new DateTime(year, month, 1); 
    firstDay = firstDay.AddDays(-(int) firstDay.DayOfWeek); 
    for (int i = 0; i < 7; ++i) 
     yield return firstDay.AddDays(i); 
} 
+0

вы бьете меня на 46 секунд. +1 –

+0

И что, если неделя начинается с, например. Понедельник? Вы получите «25, 26, 27, 28, 29, 30, 1', но на самом деле неделя начинается с понедельника, 26 апреля. – Alex

+0

Зависит от того, какую систему вы используете. Запад считается началом недели в воскресенье. Если вы хотите начать с понедельника, просто добавьте один день в переменную firstDay –

0

Вот один простой способ сделать это.

//Code not tested thoroughly. 
    private DateTime[] GetWeek(int month) 
    { 
     DateTime firstDayofMonth = new DateTime(DateTime.Now.Year, month, 1); 
     if (firstDayofMonth.DayOfWeek == DayOfWeek.Sunday) 
      return GetWeek(firstDayofMonth); 
     else 
     { 
      DateTime sundayOfPreviousMonth = firstDayofMonth; 
      do 
      { 
       sundayOfPreviousMonth = sundayOfPreviousMonth.AddDays(-1); 
      } while (sundayOfPreviousMonth.DayOfWeek != DayOfWeek.Sunday); 
      return GetWeek(sundayOfPreviousMonth); 
     } 
    } 

    private DateTime[] GetWeek(DateTime date) 
    { 
     if (date.DayOfWeek != DayOfWeek.Sunday) 
      throw new ArgumentException("Invalid weekday."); 
     DateTime[] week = new DateTime[7]; 
     for (int i = 0; i < week.Length; i++) 
     { 
      week[i] = date.AddDays(i); 
     } 
     return week; 
    } 
2
public static IEnumerable<DateTime> GetFirstWeek(int month, int year) 
    { 
     var firstDay = new DateTime(year, month, 1); 
     var dayOfWeek = firstDay.DayOfWeek; 
     var firstWeekDay = firstDay.AddDays(-(int)dayOfWeek); 

     for (int i = 0; i < 7; i++) 
     { 
      yield return firstWeekDay.AddDays(i); 
     } 
    } 
0

Проверьте этот код:

var days = new[] 
{ 
    "S", "M", "T", "W", "TH", "F", "Sa" 
}; 
var date = DateTime.Parse("01.05.2010"); 
var dayOfWeek = (int)date.DayOfWeek; 

for(var i = 0; i < 7; i++) 
{ 
    Console.WriteLine(days[i] + ": " + date.AddDays(i - dayOfWeek)); 
} 

Это просто код, чтобы дать вам представление - например, если вы используете CultureInfo для анализа вашей даты. Я использую любую дату как вход прямо сейчас, но вы можете сократить ее до первого дня каждого месяца.

1

Это должно работать:

DateTime date = new DateTime(year, month, 1); 
DayOfWeek firstDay = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; 
int daysBack = (7 + date.DayOfWeek - firstDay) % 7; 

Enumerable.Range(-daysBack, 7) 
    .Select(x => date.AddDays(x)) 
    .ToList() 
    .ForEach(d => 
    { 
     // a place for html generation 
    }); 
+0

+1 для элегантного подхода Linq –

Смежные вопросы