1

我正在尝试列出接下来的 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

4 回答 4

2

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

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

在 ISO 日历中,一周年的第一周是第一个周一至周日的一周,其中有 4 天或更多天。

目前尚不清楚您为什么要跳过第 53 周 - 它不仅跳过 1 或 2 天,而且跳过了整整一周。

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

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

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

于 2012-11-13T18:56:34.523 回答
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
于 2012-11-13T18:59:51.090 回答
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)
于 2012-11-13T18:56:12.753 回答
-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);
    }
}
于 2012-11-13T18:57:34.230 回答