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

C#:获取两个日期内的所有周数全球化/ISO 8601兼容,c#,date,numbers,C#,Date,Numbers,我有一个 开始日期2010-01-01(我假设这是一周的第一天) 和 enddate2010-07-31(我假设这是一周的第一天) 我想从一个方法返回一周中每个第一天的所有周数 时间跨度以上。我不能假设一周的第一天总是星期一,因为我的用户 可能来自瑞典、美国或其他任何地方。算法应与ISO 8601兼容 最终结果大致如下所示: 2010-01-01 , 1 2010-01-08 , 2 2010-01-15 , 3 2010-01-22 , 4 ... 2010-07-31 , ~28 是的,我

我有一个

开始日期2010-01-01(我假设这是一周的第一天)

enddate2010-07-31(我假设这是一周的第一天)

我想从一个方法返回一周中每个第一天的所有周数

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

可能来自瑞典、美国或其他任何地方。算法应与ISO 8601兼容

最终结果大致如下所示:

2010-01-01 , 1
2010-01-08 , 2
2010-01-15 , 3
2010-01-22 , 4
...
2010-07-31 , ~28
是的,我知道谷歌有很多关于这个话题的链接,但是没有人做得对。他们都

假设周一是一周的第一天。也许有一些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;
        }
我在谷歌上找到了一部分,并做了一些修改

var week = new DateTime(2010, 1, 1).AddDays(7 * i);
Console.Out.WriteLine("week = {0}", week);
其中
i
是您想要的周数。因为它是一种日期时间类型,所以您可以根据区域设置对其执行任何操作。处理闰年只需要一点点工作。您可以使用
DateTime.IsLeapYear()
检测是否是闰年,如果日期超过2/29,则添加一天


其中
i
是您想要的周数。因为它是一种日期时间类型,所以您可以根据区域设置对其执行任何操作。处理闰年只需要一点点工作。您可以使用
DateTime.IsLeapYear()
检测是否是闰年,如果日期超过2/29,则添加一天。

您可能需要查看CultureInfo.CurrentCulture.Calendar.GetWeekOfYear

编辑:

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

DateTime的前面部分允许您将其用作DateTime对象的函数

所以你可以

int week = DateTime.Now.GetWeekNumber();

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

编辑:

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

DateTime的前面部分允许您将其用作DateTime对象的函数

所以你可以

int week = DateTime.Now.GetWeekNumber();
public IList GetWeekNumber(日期时间开始日期、日期时间结束日期)
{
CultureInfo currentCulture=CultureInfo.currentCulture;
DateTimeFormatInfo dfi=DateTimeFormatInfo.CurrentInfo;
var result=新列表();
对于(DateTime tm=startDate;tm
public IList GetWeekNumber)(DateTime startDate,DateTime endDate)
{
CultureInfo currentCulture=CultureInfo.currentCulture;
DateTimeFormatInfo dfi=DateTimeFormatInfo.CurrentInfo;
var result=新列表();
对于(DateTime tm=startDate;tm而言,不兼容ISO 8601(参见社区评论)

免费课程包括与ISO 8601兼容的课程周:

// ----------------------------------------------------------------------
public int GetWeekOfYear( DateTime moment )
{
  return new Week( moment ).WeekOfYear;
} // GetWeekOfYear
与ISO 8601不兼容(请参阅社区评论)

免费课程包括与ISO 8601兼容的课程周:

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

为什么你的示例代码与我的示例代码如此不同?查看我的更新问题。为什么你的示例代码与我的示例代码如此不同?查看我的更新问题。这或多或少就是我的答案的目的。你赢了我;)这或多或少就是我的答案的目的。你赢了我;)你也可能想使用DateTimeFormatInfo.CurrentInfo.CalendarWeekRule的规则,因为像我的一些国家(荷兰人)使用第一个四周规则。但是我认为第一个4天的规则与ISO 8601不兼容?正如我所说的,我想考虑。NL,SE等等……所有这些:)DoGigt我在谷歌上找到这个引文:“…关于区域性依赖性的一点是DayOfWeek。对于某些区域性,周一不是正确的选择。DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek将为您提供区域性依赖的DayOfWeek枚举值。Lars,尝试使用CalendarWeekRule.FirstDay而不是FirstFourDayWeek,这提供了我想要的结果…”。。。"来源:--因此我问你,为什么你建议我使用FirstFourDayWeek规则而不是FirstDay?不,如果不清楚,很抱歉,我建议你使用对当前区域性具有正确值的属性,即DateTimeFormatInfo.CurrentInfo.CalendarWeekRule,请参阅答案中的示例代码。它应该包含区域性设置的FirstDays、 但是我的(荷兰)文化设置是FirstFourDayWeek。这又让人困惑了……我的文化的第一天——你的文化的第一个4DayWeek?看起来我必须这样做?伪代码:if(currentCulture(“en-en”)选择FirstDay;if(currentCulture(“nl-nl”)选择First4DayWeek;这就是你的意思吗?但我不想将文化设置为30 if-else等,不是有一种通用的方法吗?你可能还想使用DateTimeFormatInfo.CurrentInfo.CalendarWeekRule作为规则,因为有些国家像我的国家(荷兰)使用第一个四周的规则。但是我认为第一个星期的规则与ISO 8601不兼容?正如我所说的,我想考虑。NL,SE等等……所有这些:)道格特我在谷歌上找到这个引文:“…关于区域性依赖性的一点是DayOfWeek。对于某些区域性,周一不是正确的选择。DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek将为您提供区域性依赖的DayOfWeek枚举值。Lars,尝试使用CalendarWeekRule.FirstDay而不是FirstFourDayWeek,这提供了我想要的结果…”。。。"来源:--因此我问你,为什么你建议我使用FirstFourDayWeek规则而不是FirstDay?不,如果不清楚,很抱歉,我建议你使用对当前区域性具有正确值的属性,即DateTimeFormatInfo.CurrentInfo.CalendarWeekRule,请参阅答案中的示例代码。它应该包含区域性设置的FirstDays、 但是我的(荷兰)文化设置是FirstFourDayWeek。这又让人困惑了…我的文化的第一天-你的文化的第一个4DayWeek?看起来我必须这样做?伪代码:if(cur)