![](/img/trans.png)
[英]C# - Get the first day and last day of the week knowing the week number, month number and year
[英]How do I get the month number from the year and week number in c#?
正如标题所说,给定年份和周数,我如何获得月份数?
编辑:如果一周跨越两个月,我想要一周的第一天所在的月份。
编辑(2):这就是我获得周数的方式:
CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Monday);
我只是想反其道而行之。
如果您假设一周定义的第一天与一年中的第一天是同一天,那么这将起作用:
int year = 2000;
int week = 9;
int month = new DateTime(year, 1, 1).AddDays(7 * (week - 1)).Month;
显然,一个真正的答案将取决于您如何定义一周的第一天,以及当一周重叠多个时,您如何定义一周如何落入一个月。
这就是我最终做的事情:
static int GetMonth(int Year, int Week)
{
DateTime tDt = new DateTime(Year, 1, 1);
tDt.AddDays((Week - 1) * 7);
for (int i = 0; i <= 365; ++i)
{
int tWeek = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
tDt,
CalendarWeekRule.FirstDay,
DayOfWeek.Monday);
if (tWeek == Week)
return tDt.Month;
tDt = tDt.AddDays(1);
}
return 0;
}
我更喜欢更简单的东西,但它有效:)
它不也取决于星期几吗?
这应该可以提供帮助
public int getMonth(int weekNum, int year)
{
DateTime Current = new DateTime(year, 1, 1);
System.DayOfWeek StartDOW = Current.DayOfWeek;
int DayOfYear = (weekNum * 7) - 6; //1st day of the week
if (StartDOW != System.DayOfWeek.Sunday) //means that last week of last year's month
{
Current = Current.AddDays(7 - (int)Current.DayOfWeek);
}
return Current.AddDays(DayOfYear).Month;
}
假设:
将开始和结束月份输出为 integer 数组。
public int[] getMonth(int weekNum, int year) { DateTime StartYear = new DateTime(year, 1, 1); System.DayOfWeek StartDOW = StartYear.DayOfWeek; DateTime DayOfYearWeekStart = default(DateTime); DateTime DayOfYearWeekEnd = default(DateTime); int x = 0; if ((StartDOW == System.DayOfWeek.Sunday)) { DayOfYearWeekStart = StartYear.AddDays((weekNum - 1) * 7); DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6); } else { for (x = 0; x <= 7; x += 1) { if (StartYear.AddDays(x).DayOfWeek == DayOfWeek.Sunday) { break; // TODO: might not be correct. Was: Exit For } } if (weekNum == 1) { DayOfYearWeekStart = StartYear; DayOfYearWeekEnd = StartYear.AddDays(x - 1); } else if (weekNum > 1) { DayOfYearWeekStart = StartYear.AddDays(((weekNum - 2) * 7) + x); DayOfYearWeekEnd = DayOfYearWeekStart.AddDays(6); } } int[] Month = new int[2]; Month[0] = DayOfYearWeekStart.Month; Month[1] = DayOfYearWeekEnd.Month; return Month; }
您可能面临的另一个问题是,大多数年份不是从一周的开始开始的,这会改变一切。
在 .NET 3.0 及更高版本中,您可以使用ISOWeek
。
public static int MonthOfFirstDay(int year, int week)
{
return ISOWeek.ToDateTime(year, week, DayOfWeek.Monday).Month;
}
请注意,这一年可能不合适,因为一年的第一周可能已经在前一年的 12 月底开始。 例如,2020 年的第一周从 2019 年 12 月 30 日星期一开始。
你不能。 您至少需要第一周开始的那一天(或一周开始的时间)才能获得准确的答案。
你不能。 一周可能从一个月开始,到另一个月结束。
我认为您假设“周”是连续 7 天的任何组。 它不是。 给定年(2008 年),周(5),您可能在 1 月或 2 月,这取决于您的“周”何时开始。
// Calculate the week number according to ISO 8601
public static int Iso8601WeekNumber(DateTime dt)
{
return CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
// ...
DateTime dt = DateTime.Now;
// Calculate the WeekOfMonth according to ISO 8601
int weekOfMonth = Iso8601WeekNumber(dt) - Iso8601WeekNumber(dt.AddDays(1 - dt.Day)) + 1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.