【问题标题】:What is the most elegant way of showing first week in a month一个月第一周最优雅的表现方式是什么
【发布时间】:2026-02-15 18:55:01
【问题描述】:

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

鉴于每个月的开始日期都是一周中不同的一天,我试图找出一种优雅的方法来使用 DateTime 对象获取这些数据的值。我看到它在某个日期有一个 dayofweek 属性。

我正在我的服务器上用 C# 生成此表以传递到 html 页面。

【问题讨论】:

    标签: c# date html-table


    【解决方案1】:

    您可以使用以下代码获取第一周:

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

    【讨论】:

    • 你比我快 46 秒。 +1
    • 如果一周从例如开始呢?周一?您将收到 25, 26, 27, 28, 29, 30, 1,但实际上一周从 4 月 26 日星期一开始。
    • 取决于您使用的系统。西方人认为星期天是一周的开始。如果您想从星期一开始,只需在 firstDay 变量中添加一天
    • @AZ:我以为一周从(整个)欧洲的星期一开始,但既然你来自罗马尼亚......
    • @AZ,例如一周从星期一开始,-(int)firstDay.DayOfWeek 给出0(星期日);添加一天会得到1 而不是6(2009 年 3 月)。
    【解决方案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);
            }
        }
    

    【讨论】:

      【解决方案3】:

      这应该可行:

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

      【讨论】:

        【解决方案4】:

        这是一种简单的方法。

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

        【讨论】:

          【解决方案5】:

          检查此代码:

          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 来解析您的日期。我现在使用任何日期作为输入,但您也可以将其缩短到每个月的第一天。

          【讨论】:

            最近更新 更多