代码之家  ›  专栏  ›  技术社区  ›  leora Matt Lacey

一个月内第一周最优雅的表演方式是什么

  •  0
  • leora Matt Lacey  · 技术社区  · 14 年前

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

    考虑到每个月的开始日期都不同于一周中的某一天,我试图找到一种使用datetime对象获取此数据值的优雅方法。我看到它在某个日期有一个星期的财产。

    我正在我的服务器上用C生成这个表,以便传递到一个HTML页面。

    5 回复  |  直到 7 年前
        1
  •  3
  •   Julien Lebosquain    14 年前

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

    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
  •  2
  •   Adrian Zanescu    14 年前
    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
  •  1
  •   Oleks    14 年前

    这应该有效:

    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
  •  0
  •   this. __curious_geek    14 年前

    这是一个简单的方法。

        //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
  •  0
  •   tanascius    14 年前

    检查此代码:

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