所以我有一个应用程序需要获取日期焦点,以便它可以正常运行。鉴于要关注的特定日期,需要知道它在哪一周。我根据周一日期计算周数。而且我想知道我对星期一的关注是否过度。
public static DateTime PreviousMonday(this DateTime dt)
{
var dateDayOfWeek = (int)dt.DayOfWeek;
if (dateDayOfWeek==0)
{
dateDayOfWeek = dateDayOfWeek + 7;
}
var alterNumber = dateDayOfWeek - ((dateDayOfWeek*2)-1);
return dt.AddDays(alterNumber);
}
/// <summary>
/// Personal tax week starts on the first Monday after the week with 6th April in unless 6th April is a Monday in
/// which case that starts the first week. In a leap year this means you can have a week 53 which due to the mod 4 approach of calculating
/// flexi week means you get a 5 week flexi period.
/// As such this method forces the weeks into the range 1 - 52 by finding the week number for the week containing 6th April and
/// the number for the current week. Treating the 6th April week as week 1 and using the difference to calculate the tax week.
/// </summary>
public static int GetTaxWeek(this DateTime dt)
{
var startTaxYear = GetActualWeekNumber(new DateTime(DateTime.Now.Year, 4, 6));
var thisWeekNumber = GetActualWeekNumber(dt);
var difference = thisWeekNumber - startTaxYear;
return difference < 0 ? 53 + difference : difference + 1;
}
private static int GetActualWeekNumber(DateTime dt)
{
var ci = System.Threading.Thread.CurrentThread.CurrentCulture;
var cal = ci.Calendar;
var calWeekRule = ci.DateTimeFormat.CalendarWeekRule;
var fDoW = ci.DateTimeFormat.FirstDayOfWeek;
return cal.GetWeekOfYear(dt, calWeekRule, fDoW);
}
public static int PeriodWeek(this DateTime dt)
{
var rawPeriodWeek = GetTaxWeek(dt) % 4;
return rawPeriodWeek == 3 ? 1 : rawPeriodWeek + 2;
}
}
系统运行从第一个纳税周开始的滚动4周计划,并且需要根据计划中的位置采取不同的行为。所以你可以看到......
userDate
)userDate=userDate.PreviousMonday();
到达本周一
给定 - 周日是周末userDate.PeriodWeek();
并获取
您所在的时间段为1至4。GetTaxWeek是公开的,因为它在其他地方使用过......我也更换了多次使用的日期,我不想记得多次更改它。
我可以看到树木吗?或者是否有更多的无差错方式。
答案 0 :(得分:6)
我认为您可以使用GregorianCalendar
内的System.Globalization
大大简化您的代码。在这里,您可以获得给定日期的周数:
GregorianCalendar gc = new GregorianCalendar();
int weekno = gc.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
您在此处看到,您可以根据当地规则提供有关如何计算周数的规则。就像在挪威一样,我们将星期一作为我们的第一个工作日,而一年中的第一周是有四天或更长时间的第一周。将此设置为您的特定于文化的规则,以获得正确的周数。
你仍然需要手工完成一些特定的处理,但至少可以使用这个删除一些混乱:)
答案 1 :(得分:0)
为什么不使用DateTimePicker
控件?它会告诉您用户所选日期的日期。然后你可以简单地减去不。从星期一到星期几的日子。例如:
我正在使用DateTimePicker
控件并将其命名为dtpTemp。使用的事件是
dtpTemp_ValueChanged()
dtpTemp.Value.DayOfWeek
- 会给你一天:星期二,星期三,星期四等等。
然后您可以相应地使用以下代码与开关案例:
dtpTemp.Value.AddDays(num);
获取星期一的日期
这里num将具有-ve值,这取决于上面计算的日期。值:周二为-1,周三为-2,周四为-3,等等。
另外,使用datetimepicker也会对UI本身产生积极影响。