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

时间:2010-10-31 23:41:39

标签: c# date numbers

我有一个

startdate 2010-01-01 (我假设它是一周的第一天)

enddate 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

是的,我知道谷歌有很多关于该主题的链接,但没有人做得对。他们都

假设星期一是一周的第一天。也许SO上的一些c#神经过:P

编辑:

您对此代码说了什么:

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

我在google上发现了一些并且稍微改了一下。

4 个答案:

答案 0 :(得分:2)

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

编辑:

对您自己的示例进行小修复,并将其作为扩展,以便更容易使用;)

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

这个DateTime的前面允许你使用它,好像它是一个DateTime对象的函数。

所以你可以做到

int week = DateTime.Now.GetWeekNumber();

答案 1 :(得分:1)

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

i是您想要的周数。由于它是DateTime类型,您可以通过区域设置随意执行任何操作。处理闰年只需要一点点工作。您可以使用DateTime.IsLeapYear()来检测它是否是闰年,如果日期超过2/29,则可以添加一天。

答案 2 :(得分: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;
}

答案 3 :(得分:1)

Calendar.GetWeekOfYear与ISO 8601不兼容(请参阅社区评论)。

免费Time Period Library for .NET包含类,与ISO 8601兼容:

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