2010-05-17 67 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

相关问题