我想在C#中创建一个函数,一个星期的编号会在那一周返回我的日子。在.net中,知道周数如何获得星期几日期?
例如,对于第40周,我如何得到日期: 4/10,5/10,6/10,7/10,8/10,9/10,10/10。
预先感谢您!
我想在C#中创建一个函数,一个星期的编号会在那一周返回我的日子。在.net中,知道周数如何获得星期几日期?
例如,对于第40周,我如何得到日期: 4/10,5/10,6/10,7/10,8/10,9/10,10/10。
预先感谢您!
我想这应该做你想要什么:
public static DateTime[] WeekDays(int Year, int WeekNumber)
{
DateTime start = new DateTime(Year, 1, 1).AddDays(7 * WeekNumber);
start = start.AddDays(-((int)start.DayOfWeek));
return Enumerable.Range(0, 7).Select(num => start.AddDays(num)).ToArray();
}
虽然我把星期日作为一周的第一天,如果你想周一那样,从(0,7)的第一天变动范围(1,7 )。
如果要符合ISO标准,我认为这应该工作:
public static DateTime[] WeekDays(int Year, int WeekNumber)
{
DateTime start = new DateTime(Year, 1, 4);
start = start.AddDays(-((int)start.DayOfWeek));
start = start.AddDays(7 * (WeekNumber - 1));
return Enumerable.Range(0, 7).Select(num => start.AddDays(num)).ToArray();
}
这基本上取决于你在世界上的哪个地方,因为在欧洲,第一周是第一周有4天,而在美国是1/1(http: //en.wikipedia.org/wiki/Seven-day_week#Week_numbering) - 所以代码是正确的,除了“基地”可能需要调整。 – veggerby 2010-10-04 10:57:56
据我记得,从一个老年项目,上述代码将无法正常工作时(8601什么是在欧洲经常使用)计算,如果基地将被调整(见我的答案)。但是也许这已经改变了.net4。 – HCL 2010-10-04 11:05:36
是的,你是正确的,它不符合ISO标准。可以很容易地调整以符合标准。将把和纠正。 – JDunkerley 2010-10-04 11:19:22
注
我似乎已经错过了错误。当前代码已更新为2012-01-30,以说明这一事实,现在我们根据Mikael Svenson根据星期二推导出
daysOffset
似乎可以解决问题。有关详细信息,请参见此answer。
大多数人往往犯了这个错误,并通过错我的意思是不符合ISO8601星期日期(我们使用了很多瑞典)标准。这种计算是有点儿奇怪,但它归结为这个代码在.NET:
DateTime jan1 = new DateTime(yyyy, 1, 1);
int daysOffset = DayOfWeek.Tuesday - jan1.DayOfWeek;
DateTime firstMonday = jan1.AddDays(daysOffset);
var cal = CultureInfo.CurrentCulture.Calendar;
int firstWeek = cal.GetWeekOfYear(jan1, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
var weekNum = ww;
if (firstWeek <= 1)
{
weekNum -= 1;
}
var result = firstMonday.AddDays(weekNum * 7 + d - 1);
return result;
它将计算一年(年)的日期,星期数(WW)和星期(d)。它通过首先使用内置日历建立1月的第一天来完成(所以这个代码可以自定义)。这有点奇怪的原因是因为53周有时发生在1月份,有时1月份发生在12月份。
如果你需要走另一条路,它不是微不足道的,但在.NET中显示的正确方法是这里显示的。
var c = CultureInfo.CurrentCulture.Calendar;
// `FromDayOfWeek` fixes problem with the enumeration
// not based on Monday being the first day of the week
d = (byte)FromDayOfWeek(c.GetDayOfWeek(t));
switch (d)
{
case 1:
case 2:
case 3:
// see this for details
// http://blogs.msdn.com/shawnste/archive/2006/01/24/iso-8601-week-of-year-format-in-microsoft-net.aspx
t = t.AddDays(3);
break;
}
ww = (byte)c.GetWeekOfYear(t, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
// Adjust year when week 53 occurs in January or week 1 occurs in December
if (ww == 53 && t.Month == 1)
{
yyyy = (short)(t.Year - 1);
}
else if (ww == 1 && t.Month == 12)
{
yyyy = (short)(t.Year + 1);
}
else
{
yyyy = (short)t.Year;
}
以下功能将帮助您获得起价周数日期和年份
public DateTime GetFirstDayFromWeekNumber(int weekNumber, int weekYear)
{
DateTime beginingYear = new DateTime(weekYear, 1, 1);
DateTime finalDate = new DateTime();
int maxDayOfWeek = (int)DayOfWeek.Saturday;
int yearStartDay = (int)beginingYear.DayOfWeek;
int dayDeference = maxDayOfWeek - yearStartDay;
if (weekNumber == 1)
{
finalDate = beginingYear.AddDays(-yearStartDay);
}
else if (weekNumber == 2)
{
finalDate = beginingYear.AddDays((dayDeference + 1));
}
else if (weekNumber > 2 && weekNumber <= 53)
{
finalDate = beginingYear.AddDays((dayDeference + 1) + ((weekNumber - 2)* 7));
}
return finalDate;
}
的[计算从周数日期]可能重复(http://stackoverflow.com/questions/662379/calculate-date-from-week-number) – andreiursan 2013-06-06 15:34:43