我如何列出接下来的几周?

时间:2012-11-13 18:51:21

标签: c# asp.net list week-number

我想列出接下来的10周

结果应该是这样的:

Week        Year
----------------
45:         2012  
46:         2012  
47:         2012  
48:         2012  
49:         2012  
50:         2012  
51:         2012  
52:         2012  
1:          2013  
2:          2013  

有些年份有53周,而今年12月31日是星期一,本周是1周还是53周?

无论如何,我想跳过第53周,每当它出现时。这意味着1或2天不会成为列表中任何一周的一部分,但这并不重要。

4 个答案:

答案 0 :(得分:2)

  有些年份有一个星期53,而今年12月31日是星期一,是本周1或53周?

假设您的意思是“一周中的一周”,那将是2013年的第一周。

在ISO日历中,一周中的第一周是第一周一至周日,其中有4天或更长时间。

目前尚不清楚为什么你想跳过第53周 - 它不会跳过1或2天,它会跳过整整一周。

当然,这实际上假设您的意思是“年度周”的ISO定义。如果你不这样做,那就不一样了。在进行任何其他操作之前,您需要澄清您的要求。

要从.NET获取周周,您可以使用Calendar.GetWeekOfYear - 用于您使用CalendarWeekRule.FirstFourDayWeekDayOfWeek.Monday的ISO定义。我不知道是否有什么可以获得周年本身。

作为一个明显的插件,我的Noda Time在日期上支持WeekYearWeekOfWeekYear,您可以构建给定周 - 年/周 - 的日期周/周组合。

答案 1 :(得分:1)

我刚刚写了一个小型控制台应用程序就是这样做的:

static void Main(string[] args)
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        DateTime dt = DateTime.Now; //Use current date as starting point
        for (int i = 0; i < 10; i++)
        {

            int weekNo = ci.Calendar.GetWeekOfYear(
            dt,
            ci.DateTimeFormat.CalendarWeekRule,
            ci.DateTimeFormat.FirstDayOfWeek
             );
            int year = ci.Calendar.GetYear(dt);
            if (weekNo == 53) //if week number==53, then go to next week
            {
                dt = dt.AddDays(7);
                weekNo = ci.Calendar.GetWeekOfYear(
                dt,
                ci.DateTimeFormat.CalendarWeekRule,
                ci.DateTimeFormat.FirstDayOfWeek
                 );
                year = ci.Calendar.GetYear(dt);
            }

            dt = dt.AddDays(7);
            Console.WriteLine(weekNo + "-" + year);
        }
    }  

今天输出:

    46-2012
    47-2012
    48-2012
    49-2012
    50-2012
    51-2012
    52-2012
    1-2013
    2-2013
    3-2013

答案 2 :(得分:0)

来自msdn http://msdn.microsoft.com/en-us/library/system.globalization.calendar.getweekofyear.aspx

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
      DateTime date1 = new DateTime(2011, 1, 1);
      Calendar cal = dfi.Calendar;

      Console.WriteLine("{0:d}: Week {1} ({2})", date1, 
                        cal.GetWeekOfYear(date1, dfi.CalendarWeekRule, 
                                          dfi.FirstDayOfWeek),
                        cal.ToString().Substring(cal.ToString().LastIndexOf(".") + 1));       
   }
}
// The example displays the following output: //       1/1/2011: Week 1 (GregorianCalendar)

答案 3 :(得分:-1)

以下内容将根据自年初以来的周数进行。

如果您希望这是基于整周,那么您需要根据一年中第一周的日期确定开始时的偏移量为0或1。

public class Week
{
    public Week(int weekOfYear, int year)
    {
        WeekOfYear = weekOfYear;
        Year = year;
    }
    public int WeekOfYear { get; private set; }
    public int Year { get; private set; }
}
public IEnumerable<Week> Next10Weeks(DateTime startDate)
{
    DateTime tempDate = startDate;
    for (int i = 0; i < 10; i++)
    {
        //add one to first parameter if you want the 1-indexed week instead of 0 indexed
        yield return new Week(tempDate.DayOfYear % 7, tempDate.Year);
        tempDate.AddDays(7);
    }
}