簡體   English   中英

顯示一個月的第一周最優雅的方式是什么

[英]What is the most elegant way of showing first week in a month

在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 | 薩|
25-26-27-28-29-30-1

鑒於每個月的開始時間都是一周中的不同日期,我試圖找出一種優雅的方法來使用DateTime對象獲取此數據的值。 我看到它在日期上具有dayofweek屬性。

我正在服務器上的C#中生成此表,以傳遞到html頁面。

您可以使用以下代碼來獲得第一周的服務:

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);
}
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);
        }
    }

這應該工作:

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
    });

這是執行此操作的一種簡單方法。

    //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;
    }

檢查此代碼:

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解析日期。 我現在使用任何日期作為輸入,但是您也可以將其縮短到每個月的第一天。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM