我需要计算给定日期的周数,当我的年份从5月1日开始。
我的希望是使用Calendar.GetWeekOfYear()
,它应用我需要的规则,但是通过覆盖Calendar
来源于GregorianCalendar
的一年中的第一天。
不幸的是,我找不到这样做的方法。在相关日期添加任意122/123天将违反我希望使用的GetWeekOfYear()
CalendarWeekRule.FirstFourDayWeek
规则。
如果没有编写自定义并且我怀疑用于确定此问题的混乱算法,是否有一种方法可以计算给定日期的周数,当我的年份从5月1日开始?
答案 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;
}