2010-05-17 48 views
0

在C#中,我想顯示在日曆(在HTML表中)的第一週,我想弄清楚最優雅的算法來生成正確的天。什麼是最優雅的方式顯示在一個月內的第一週

如果一週的第一天不是星期天,我想顯示前一個月的日子(就像您在常規日曆上看到的那樣)。所以,作爲一個輸入你有一個當前的月份。在這種情況下,5月。我想生成此:

月:可能

<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 – 2010-05-17 12:00:19

+0

如果一週從例如星期一?你會得到'25,26,27,28,29,30,1',但實際上一週從4月26日星期一開始。 – Alex 2010-05-17 12:13:17

+0

取決於您使用的系統。西方人考慮星期日的一週開始。如果您想從星期一開始,只需在firstDay變量中添加一天 – 2010-05-17 12:25:35

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方法 – 2010-05-18 11:44:15

相關問題