计算一个日期的周数,当您的年份从非1月1日开始

时间:2016-09-12 15:08:01

标签: c#

我需要计算给定日期的周数,当我的年份从5月1日开始。

我的希望是使用Calendar.GetWeekOfYear(),它应用我需要的规则,但是通过覆盖Calendar来源于GregorianCalendar的一年中的第一天。

不幸的是,我找不到这样做的方法。在相关日期添加任意122/123天将违反我希望使用的GetWeekOfYear() CalendarWeekRule.FirstFourDayWeek规则。

如果没有编写自定义并且我怀疑用于确定此问题的混乱算法,是否有一种方法可以计算给定日期的周数,当我的年份从5月1日开始?

2 个答案:

答案 0 :(得分:1)

也许您可以使用这种方法,从给定的DateTime中减去从1月1日到5月1日的121天,然后在该日期使用Calendar.GetWeekOfYear

static readonly int DayOffset = (new DateTime(DateTime.Today.Year, 5, 1) 
                               - new DateTime(DateTime.Today.Year, 1, 1)).Days; // 121

// ... somewhere else:
DateTime date = DateTime.Today;
DateTime offsetDate = date.AddDays(-DayOffset);
int weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(offsetDate, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
Console.WriteLine("Year:{0} Week:{1}", offsetDate.Year, weekNum); // Year:2016 Week:19

答案 1 :(得分:0)

我最终得到了这个,但有效但不能处理第53周的情况:

    private int calculateBizWeekNumber(DateTime date, DateTime yearStart, CalendarWeekRule cwr, DayOfWeek firstDoW)
    {
        var cal = DateTimeFormatInfo.CurrentInfo.Calendar;

        var dateWoY = cal.GetWeekOfYear(date, cwr, firstDoW);
        var firstWoY = cal.GetWeekOfYear(yearStart, cwr, firstDoW);

        var bizWeek = dateWoY - firstWoY + 1;

        return bizWeek <= 0 ? 52 + bizWeek : bizWeek;
    }