按周编号查找开始日期和结束日期,开始星期几和年份 [英] Find start and end date by week number , start day of week and year
问题描述
我想获得特定周的开始和结束日期。
我有三个输入:
1.年
2。周数
3.周开始日(可配置:由我们网站的配置决定,不是标准或c#)。
我有按照我的要求枚举如下(所以我使用c#的枚举,其中星期日取价值0):
公共枚举EN50160DayOfWeek
{
星期一= 1,
星期二= 2,
星期三= 3,
星期四= 4,
星期五= 5,
星期六= 6,
星期日= 7
}
我想通过我的系统使用我的枚举和周开始日来开始和结束日期(无论是从周日开始,也可以是周日或周一或周二等)。
我尝试过:
无法创建逻辑。我想创建泛型函数。
I want to get start and end date of particular week.
I am having three inputs :
1. Year
2. Week number
3. Week start day (Configurable : decided by configuration in our website not by standard or c#).
I am having Enum as below as per my requirement(So i am using enum of c# where sunday takes value 0):
public enum EN50160DayOfWeek
{
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
Sunday = 7
}
I want start and end date by using my enum and week start day from my system (whether week start from sunday or monday or tuesday and so on).
What I have tried:
Unable to create logic.I want to create generic function.
推荐答案
你遇到的第一个问题是定义周数。我将假设您的意思是ISO周号( ISO周日期 - 维基百科 [ ^ ])等同于 CalendarWeekRule.FirstFourDayWeek
。要了解为什么这很重要,请考虑以下代码段,其中列出了2017年1月16日所在的一周,在公历中,为计算周数的3个不同选项:
The first issue you have is to define "week number". I'm going to assume you mean the ISO Week Number (ISO week date - Wikipedia[^]) which equates to CalendarWeekRule.FirstFourDayWeek
. To see why this is important consider this code snippet, which lists the week that 2017-January-16 falls in, in the Gregorian calendar, for the 3 different options for counting weeks:
var cc = new GregorianCalendar();
dt = new DateTime(2017,1,16);
Console.WriteLine("Week {0} {1} {2}", cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Monday));
Console.WriteLine("Week {0} {1} {2}", cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Tuesday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, DayOfWeek.Tuesday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Tuesday));
Console.WriteLine("Week {0} {1} {2}", cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Wednesday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, DayOfWeek.Wednesday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Wednesday));
Console.WriteLine("Week {0} {1} {2}", cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Thursday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, DayOfWeek.Thursday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Thursday));
Console.WriteLine("Week {0} {1} {2}", cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Friday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, DayOfWeek.Friday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Friday));
Console.WriteLine("Week {0} {1} {2}", cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Saturday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, DayOfWeek.Saturday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Saturday));
Console.WriteLine("Week {0} {1} {2}", cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday), cc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Sunday));
它给出结果
Week 3 3 4
Week 2 2 3
Week 2 2 3
Week 3 2 3
Week 3 2 3
Week 3 2 3
Week 3 3 3
你的下一个问题是你的枚举。首先它没有很好地形成,MS建议枚举应该总是有一个值为0的条目。我真的不明白为什么你不只是使用标准枚举 - 毕竟你不关心这个数字,只是当天的名称
Your next problem is your enum. Firstly it is not well formed, MS advise that enums should always have an entry with a value of 0. I really can't see why you don't just use the standard enum - after all you don't really care about the number, just the "name" of the day
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6,
}
要使用标准的 DateTime
函数,您必须将枚举转换为标准,您可以这样做:
To use the standard DateTime
functions you are going to have to convert your enum to the standard, which you can do like this:
var Week_start = EN50160DayOfWeek.Tuesday;
var realday = (int)Enum.Parse(typeof(DayOfWeek), Week_start.ToString());
下一步是根据您需要的周数计算出一个日期在您可配置的工作日开始。在下面的代码中,我选择了一种蛮力的方法 - 从一年的第一天开始,并继续增加一天,直到你到达你想要的那一周。这显然是那个星期的第一天,增加6天会给你那个星期最后一天的日期:
The next step is to work out a date for the week number you require, based on your configurable start of week day. In the code below I've chosen a "brute-force" approach - start on the first day of the year and keep adding a day until you get to the week you want. That is obviously going to be the first day of that week and adding 6 days will give you the date of the last day in that week:
var year = 2017;
var week_number = 3;
var Week_start = EN50160DayOfWeek.Tuesday;
var realday = Enum.Parse(typeof(DayOfWeek), Week_start.ToString());
var cc = new GregorianCalendar();
var dt = new DateTime(year, 1, 1);
for (var i = 0; i < 365; i++)
{
dt = dt.AddDays(1);
if (week_number == cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, (DayOfWeek)realday)) break;
}
var startOfWeek = dt;
var endOfWeek = startOfWeek.AddDays(6);
如果你认为这种方法在一年中的几个星期之后效率太低,那么你可以将YYYY-Jan-01的日期增加1,直到你到达第1周的开始。这并不像它听起来那么愚蠢。只有 CalendarWeekRule.FirstDay
才能保证第1周从1月1日开始。一旦您有第1周的开始日期,只需添加适当的天数即可找到您想要的一周。像这样:
If you think that method is too inefficient for weeks later in the year, then you can increment the date of YYYY-Jan-01 by 1 until you get to the start of Week 1. This isn't as silly as it sounds as it is only CalendarWeekRule.FirstDay
that will guarantee Week 1 starts on 1st January. Once you have the start date of week 1 just add the appropriate number of days to find the week you want. Like this:
var year = 2017;
var week_number = 3;
var Week_start = EN50160DayOfWeek.Tuesday;
var realday = Enum.Parse(typeof(DayOfWeek), Week_start.ToString());
var cc = new GregorianCalendar();
var dt = new DateTime(year, 1, 1);
while (cc.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, (DayOfWeek)realday) > 1)
{
// Handle start of January being week 52 or 53 of the previous year (2017 for example)
dt = dt.AddDays(1);
}
var startOfWeek = dt.AddDays((7 * (week_number - 1)));
var endOfWeek = startOfWeek.AddDays(6);
这篇关于按周编号查找开始日期和结束日期,开始星期几和年份的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!