2010-10-31 113 views
1

我有一个C#:从2日全球化/ ISO内获取所有的星期数8601兼容

STARTDATE2010-01-01(我只是假设其一周的第一天)

结束日期2010-07-31(我只是假设其一周的第一天)

我想从方法的所有星期数中返回上一个时间段的

以上的时间段。我不能假设一周的第一天总是星期一,因为我的用户

可能是从瑞典美国或徘徊无论。该algorythm应符合ISO 8601

兼容的最终结果应该大致是这样的:

2010-01-01 , 1 
2010-01-08 , 2 
2010-01-15 , 3 
2010-01-22 , 4 
... 
2010-07-31 , ~28 

是的,我知道谷歌提供了关于该主题的联系,但没有人这样做的权利。他们都是

假设星期一是一周的第一天。也许一些C#神对SO路过:P

编辑:

你怎么给这个代码说:

public static int GetWeekNumber(DateTime dtPassed) 
     { 
      CultureInfo ciCurr = CultureInfo.CurrentCulture; 
      int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstDay, DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek); 
      return weekNum; 
     } 

我发现这部分谷歌和改变了它一下。

+0

这是或多或少,我与我的回答去。你击败了我; – 2010-11-01 00:06:48

回答

2

你可能想看看CultureInfo.CurrentCulture.Calendar.GetWeekOfYear

编辑:

小修为自己的例子,再加上使其成为一个扩展,以便更容易使用;)

​​

的这种盈日期时间让你仿佛它是一个DateTime对象的功能使用它..

,所以你可以做

int week = DateTime.Now.GetWeekNumber(); 
+0

我用示例代码更新了我的问题:) – Elisabeth 2010-11-01 00:01:59

+0

由于像我的(荷兰语)这样的一些国家使用FirstFourDayWeek规则,因此您也可能希望使用DateTimeFormatInfo.CurrentInfo.CalendarWeekRule作为规则。 – Doggett 2010-11-01 00:13:41

+0

但我认为First4DayWeek规则与iso8601不兼容?正如我所说,我想考虑.nl,.se等...所有人:) – Elisabeth 2010-11-01 05:21:58

1
var week = new DateTime(2010, 1, 1).AddDays(7 * i); 
Console.Out.WriteLine("week = {0}", week); 

其中i是你想要的星期数。既然它是一个DateTime类型,你可以用locale做它想做的任何事情。这只需要一点点处理闰年的工作。您可以使用DateTime.IsLeapYear()来检测它是否为闰年,如果日期过去2/29,则添加一个加入日期。

+0

为什么你的示例代码和我的截然不同?看到我更新的问题。 – Elisabeth 2010-11-01 00:02:32

1
public IList<int> GetWeekNumbers(DateTime startDate, DateTime endDate) 
{ 
    CultureInfo currentCulture = CultureInfo.CurrentCulture; 
    DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo; 
    var result = new List<int>(); 

    for (DateTime tm = startDate; tm <= endDate; tm = tm.AddDays(7)) 
    { 
     result.Add(currentCulture.Calendar.GetWeekOfYear(tm, dfi.CalendarWeekRule, 
               dfi.FirstDayOfWeek)); 
    } 

    return result; 
} 
+0

此示例仅在7天内更换年份时才会给出一个星期的编号。 – dampee 2015-02-12 00:06:07

+0

我认为问题在于@Jani指出.NET并没有给出正确的ISO 8601年度,并不是说这不会给一周的两周数字。 – 2015-02-12 03:11:52

1

Calendar.GetWeekOfYear不是ISO 8601兼容(见社区评论)。

自由Time Period Library for .NET包括类周,这是ISO 8601兼容:

// ---------------------------------------------------------------------- 
public int GetWeekOfYear(DateTime moment) 
{ 
    return new Week(moment).WeekOfYear; 
} // GetWeekOfYear