我想在 C# 中创建一个函数,它会在一周内返回我的天数。
例如第 40 周,我如何获得日期:4/10、5/10、6/10、7/10、8/10、9/10、10/10。
先感谢您!
我想在 C# 中创建一个函数,它会在一周内返回我的天数。
例如第 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();
}
笔记
我似乎错过了错误。当前代码已于 2012 年 1 月 30 日更新以说明这一事实,我们现在推导出
daysOffset
基于周二的代码,根据Mikael Svenson的说法,这似乎可以解决问题。有关详细信息,请参阅此答案。
大多数人往往会弄错这个错误,我的意思是不符合 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;
它将计算一年中的日期 (yyyy)、周数 (ww) 和星期几 (d)。它首先使用内置日历建立一月一日(因此可以自定义此代码)。这有点奇怪的原因是因为第 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;
}