Какой самый элегантный способ показать первую неделю в месяце - PullRequest
0 голосов
/ 17 мая 2010

В 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 | М | T | W | Че | F | Sa |
25 - 26 - 27 - 28 - 29 - 30 - 1

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

Я создаю эту таблицу в C # на моем сервере для перехода на html-страницу.

Ответы [ 5 ]

3 голосов
/ 17 мая 2010

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

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);
}
2 голосов
/ 17 мая 2010
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);
        }
    }
1 голос
/ 17 мая 2010

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

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 голосов
/ 17 мая 2010

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

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 для разбора вашей даты. Я использую любую дату в качестве входных данных прямо сейчас, но вы также можете сократить ее до первого дня каждого месяца.

0 голосов
/ 17 мая 2010

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

    //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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...