如何计算/查找给定日期的周数?

cll*_*pse 26 c# asp.net date

如何计算/查找给定日期的周数?

Jon*_*röm 72

var currentCulture = CultureInfo.CurrentCulture;
var weekNo = currentCulture.Calendar.GetWeekOfYear(
                new DateTime(2013, 12, 31),
                currentCulture.DateTimeFormat.CalendarWeekRule,
                currentCulture.DateTimeFormat.FirstDayOfWeek);
Run Code Online (Sandbox Code Playgroud)

请注意,这 符合ISO 8601标准.在瑞典,我们使用ISO 8601 数字,但即使文化被设置为"sv-SE",CalendarWeekRule也是FirstFourDayWeek,并且FirstDayOfWeek周一,变量将被设置为53而不是上述代码中的正确1.

我只用瑞典设置试过这个,但我很确定使用ISO 8601周数的所有国家(奥地利,德国,瑞士等)都会受到这个问题的影响.

Peter van OoijenShawn Steele对这个问题有不同的解决方案.

这是一个紧凑的解决方案

private static int WeekOfYearISO8601(DateTime date)
{
    var day = (int)CultureInfo.CurrentCulture.Calendar.GetDayOfWeek(date);
    return CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(date.AddDays(4 - (day == 0 ? 7 : day)), CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
Run Code Online (Sandbox Code Playgroud)

它已经过以下测试

var datesAndISO8601Weeks = new Dictionary<DateTime, int>
                        {
                            {new DateTime(2000, 12, 31), 52},
                            {new DateTime(2001, 1, 1), 1},
                            {new DateTime(2005, 1, 1), 53},
                            {new DateTime(2007, 12, 31), 1},
                            {new DateTime(2008, 12, 29), 1},
                            {new DateTime(2010, 1, 3), 53},
                            {new DateTime(2011, 12, 31), 52},
                            {new DateTime(2012, 1, 1), 52},
                            {new DateTime(2013, 1, 2), 1},
                            {new DateTime(2013, 12, 31), 1},
                        };

foreach (var dateWeek in datesAndISO8601Weeks)
{
    Debug.Assert(WeekOfYearISO8601(dateWeek.Key) == dateWeek.Value, dateWeek.Key.ToShortDateString() + " should be week number " + dateWeek.Value + " but was " + WeekOfYearISO8601(dateWeek.Key));
}
Run Code Online (Sandbox Code Playgroud)

  • 因为它比`Dictionary <DateTime更容易阅读和重复性更少,int> datesAndISO8601Weeks = new Dictionary <DateTime,int>();`我为简单类型执行此操作的原因是它保持代码一致. (5认同)

And*_*ach 5

  public static int GetWeekNumber(DateTime dtPassed)
  {
          CultureInfo ciCurr = CultureInfo.CurrentCulture;
          int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
          return weekNum;
  }
Run Code Online (Sandbox Code Playgroud)