获得C#2日期之间的日历周数 [英] Get the number of calendar weeks between 2 dates in C#

查看:117
本文介绍了获得C#2日期之间的日历周数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有关这个问题的目的,让我们假设用户将来自美国,并会使用标准的公历。因此,一个日历周开始在周日,结束上周六。

我想要做的就是确定两个日期之间存在日历周数。 2010年10月我的存在问题的很好的例子之间10/16 10/31并有4个日历周。


查看2010年10月的照片


  1. 十月10日至10月16日

  2. 10月17日至十月23日

  3. 10月24日至10月30日

  4. 10月31日至11月6日


我倒是preFER远离任何硬codeD逻辑像远:

 如果(天== DayOfWeek.Saturday&放大器;&安培; LastDayOfMonth == 31){...}

谁能想到这样做合乎逻辑的方式?


更新:

感谢所有伟大的回应,这里的一些考虑后是我用的解决方案:

  //获得当前支付期的开始和结束日期
日期时间currentPeriodStart = SelectedPeriod.Model.PeriodStart;
日期时间currentPeriodEnd = SelectedPeriod.Model.PeriodEnd;//获得第一个星期日及放大器;上周六跨度封装当前支付期
日期时间firstSunday = DayExtensions.SundayBeforePeriodStart(currentPeriodStart);
日期时间lastSaturday = DayExtensions.SaturdayAfterPeriodEnd(currentPeriodEnd);//取得在跨度日历周数
INT numberOfCalendarWeeks = DayExtensions.CalendarWeeks(firstSunday,lastSaturday);

这是从助手类的方法:

  ///<总结>
    ///支付期开始日期之前获得的第一个星期日
    ///< /总结>
    ///< PARAM NAME =periodStartDate>在工资期的开始日期和LT日期; /参数>
    ///<&回报GT;< /回报>
    公共静态的DateTime SundayBeforePeriodStart(DateTime的periodStartDate)
    {
        日期时间firstDayOfWeekBeforeStartDate;        INT daysBetweenStartDateAnd previousFirstDayOfWeek =(INT)periodStartDate.DayOfWeek - (INT)DayOfWeek.Sunday;        如果(daysBetweenStartDateAnd previousFirstDayOfWeek> = 0)
        {
            firstDayOfWeekBeforeStartDate = periodStartDate.AddDays(-daysBetweenStartDateAnd previousFirstDayOfWeek);
        }
        其他
        {
            firstDayOfWeekBeforeStartDate = periodStartDate.AddDays( - (daysBetweenStartDateAnd previousFirstDayOfWeek + 7));
        }        返回firstDayOfWeekBeforeStartDate;
    }    ///<总结>
    ///期末日期后获得的第一个星期六
    ///< /总结>
    ///< PARAM NAME =periodEndDate>在支付周期结束日期和LT日期; /参数>
    ///<&回报GT;< /回报>
    公共静态的DateTime SaturdayAfterPeriodEnd(DateTime的periodEndDate)
    {
        日期时间lastDayOfWeekAfterEndDate;        INT daysBetweenEndDateAndFollowingLastDayOfWeek =(INT)DayOfWeek.Saturday - (INT)periodEndDate.DayOfWeek;        如果(daysBetweenEndDateAndFollowingLastDayOfWeek> = 0)
        {
            lastDayOfWeekAfterEndDate = periodEndDate.AddDays(daysBetweenEndDateAndFollowingLastDayOfWeek);
        }
        其他
        {
            lastDayOfWeekAfterEndDate = periodEndDate.AddDays(daysBetweenEndDateAndFollowingLastDayOfWeek + 7);
        }        返回lastDayOfWeekAfterEndDate;
    }    ///<总结>
    ///获取2日期之间的日历周
    ///< /总结>
    ///< PARAM NAME =D1>日期跨度&LT的第一天; /参数>
    ///< PARAM NAME =D2>日期跨度&LT的最后一天; /参数>
    ///<&回报GT;< /回报>
    公共静态INT CalendarWeeks(DateTime的D1,D2的DateTime)
    {
        返回1 +(INT)((D2 - D1).TotalDays / 7);
    }

如果你很好奇,这就是我最终的日期做的:

  //在这个范围创建所有的星期天的数组
DateTime的[] _sundays =新的datetime [numberOfCalendarWeeks]//把第一个星期日在此期间
_sundays [0] = firstSunday;//通过每星期步骤,并获得每个周日,直到到达最后一个星期六
的for(int i = 1; I< = numberOfCalendarWeeks - 1;我++)
{
     日期时间D =新的DateTime();
     D = firstSunday.AddDays(我* 7);
      _sundays [I] = D;
}的for(int i = 0; I< = _sundays.Length-1;我++)
{
      //绑定我的每个星期天视图模型。
}


解决方案

下面是我认为应该星期开始和结束的天任何选择工作的通用解决方案。你完全可以简化为您的情况,但这种code为你改变了一周的开始和结束(例如到周一至周日),如果有必要的选项。这并不罕见的工资应用日历星期的定义来改变。

 的DateTime periodStart =新的日期时间(2010,10,17);
        日期时间periodEnd =新的日期时间(2010,11,14);        常量DAYOFWEEK FIRST_DAY_OF_WEEK = DayOfWeek.Monday;
        常量DAYOFWEEK LAST_DAY_OF_WEEK = DayOfWeek.Sunday;
        const int的DAYS_IN_WEEK = 7;        日期时间firstDayOfWeekBeforeStartDate;
        INT daysBetweenStartDateAnd previousFirstDayOfWeek =(INT)periodStart.DayOfWeek - (INT)FIRST_DAY_OF_WEEK;
        如果(daysBetweenStartDateAnd previousFirstDayOfWeek> = 0)
        {
            firstDayOfWeekBeforeStartDate = periodStart.AddDays(-daysBetweenStartDateAnd previousFirstDayOfWeek);
        }
        其他
        {
            firstDayOfWeekBeforeStartDate = periodStart.AddDays( - (daysBetweenStartDateAnd previousFirstDayOfWeek + DAYS_IN_WEEK));
        }        日期时间lastDayOfWeekAfterEndDate;
        INT daysBetweenEndDateAndFollowingLastDayOfWeek =(INT)LAST_DAY_OF_WEEK - (INT)periodEnd.DayOfWeek;
        如果(daysBetweenEndDateAndFollowingLastDayOfWeek> = 0)
        {
            lastDayOfWeekAfterEndDate = periodEnd.AddDays(daysBetweenEndDateAndFollowingLastDayOfWeek);
        }
        其他
        {
            lastDayOfWeekAfterEndDate = periodEnd.AddDays(daysBetweenEndDateAndFollowingLastDayOfWeek + DAYS_IN_WEEK);
        }        INT calendarWeeks = 1 +(INT)((lastDayOfWeekAfterEndDate - firstDayOfWeekBeforeStartDate).TotalDays / DAYS_IN_WEEK);

For the purposes of this question, let's assume the user will be from the US and will use the standard Gregorian calendar. So, a calendar week starts on Sunday and ends on Saturday.

What I'm trying to do is determine the number of calendar weeks that exist between two dates. A perfect example of my problem exists in October 2010. Between 10/16 and 10/31 there are 4 calendar weeks.


View a picture of October 2010

  1. October 10 - October 16
  2. October 17 - October 23
  3. October 24 - October 30
  4. October 31 - November 6


I'd prefer to stay away from any hardcoded logic like:

if (Day == DayOfWeek.Saturday && LastDayOfMonth == 31) { ... }

Can anyone think of a logical way to do this?

UPDATE:
Thanks for all the great responses, after some consideration here is the solution I used:

//get the start and end dates of the current pay period
DateTime currentPeriodStart = SelectedPeriod.Model.PeriodStart;
DateTime currentPeriodEnd = SelectedPeriod.Model.PeriodEnd;

//get the first sunday & last saturday span that encapsulates the current pay period
DateTime firstSunday = DayExtensions.SundayBeforePeriodStart(currentPeriodStart);
DateTime lastSaturday = DayExtensions.SaturdayAfterPeriodEnd(currentPeriodEnd);

//get the number of calendar weeks in the span
int numberOfCalendarWeeks = DayExtensions.CalendarWeeks(firstSunday, lastSaturday);

And here are the methods from the helper class:

    /// <summary>
    /// Get the first Sunday before the pay period start date
    /// </summary>
    /// <param name="periodStartDate">Date of the pay period start date</param>
    /// <returns></returns>
    public static DateTime SundayBeforePeriodStart(DateTime periodStartDate)
    {
        DateTime firstDayOfWeekBeforeStartDate;

        int daysBetweenStartDateAndPreviousFirstDayOfWeek = (int)periodStartDate.DayOfWeek - (int)DayOfWeek.Sunday;

        if (daysBetweenStartDateAndPreviousFirstDayOfWeek >= 0)
        {
            firstDayOfWeekBeforeStartDate = periodStartDate.AddDays(-daysBetweenStartDateAndPreviousFirstDayOfWeek);
        }
        else
        {
            firstDayOfWeekBeforeStartDate = periodStartDate.AddDays(-(daysBetweenStartDateAndPreviousFirstDayOfWeek + 7));
        }

        return firstDayOfWeekBeforeStartDate;
    }

    /// <summary>
    /// Get the first Saturday after the period end date
    /// </summary>
    /// <param name="periodEndDate">Date of the pay period end date</param>
    /// <returns></returns>
    public static DateTime SaturdayAfterPeriodEnd(DateTime periodEndDate)
    {
        DateTime lastDayOfWeekAfterEndDate;

        int daysBetweenEndDateAndFollowingLastDayOfWeek = (int)DayOfWeek.Saturday - (int)periodEndDate.DayOfWeek;

        if (daysBetweenEndDateAndFollowingLastDayOfWeek >= 0)
        {
            lastDayOfWeekAfterEndDate = periodEndDate.AddDays(daysBetweenEndDateAndFollowingLastDayOfWeek);
        }
        else
        {
            lastDayOfWeekAfterEndDate = periodEndDate.AddDays(daysBetweenEndDateAndFollowingLastDayOfWeek + 7);
        }

        return lastDayOfWeekAfterEndDate;
    }

    /// <summary>
    /// Get the calendar weeks between 2 dates
    /// </summary>
    /// <param name="d1">First day of date span</param>
    /// <param name="d2">Last day of date span</param>
    /// <returns></returns>
    public static int CalendarWeeks(DateTime d1, DateTime d2)
    {
        return 1 + (int)((d2 - d1).TotalDays / 7);
    }

And if you're curious, this is what I end up doing with the dates:

//create an array of all the sundays in this span
DateTime[] _sundays = new DateTime[numberOfCalendarWeeks];

//put the first sunday in the period
_sundays[0] = firstSunday;

//step through each week and get each sunday until you reach the last saturday
for (int i = 1; i <= numberOfCalendarWeeks - 1; i++)
{
     DateTime d = new DateTime();
     d = firstSunday.AddDays(i * 7);
      _sundays[i] = d;
}

for (int i = 0; i <= _sundays.Length-1; i++)
{
      //bind my view model with each sunday.
}

解决方案

Here's a general solution which I believe should work for any choice of week starting and ending days. You could simplify it for your case, but this code gives you the option of changing the week's start and end (e.g. to Monday to Sunday) if it becomes necessary. It's not uncommon in payroll applications for the definition of a calendar week to change.

        DateTime periodStart = new DateTime(2010, 10, 17);
        DateTime periodEnd = new DateTime(2010, 11, 14);

        const DayOfWeek FIRST_DAY_OF_WEEK = DayOfWeek.Monday;
        const DayOfWeek LAST_DAY_OF_WEEK = DayOfWeek.Sunday;
        const int DAYS_IN_WEEK = 7;

        DateTime firstDayOfWeekBeforeStartDate;
        int daysBetweenStartDateAndPreviousFirstDayOfWeek = (int)periodStart.DayOfWeek - (int)FIRST_DAY_OF_WEEK;
        if (daysBetweenStartDateAndPreviousFirstDayOfWeek >= 0)
        {
            firstDayOfWeekBeforeStartDate = periodStart.AddDays(-daysBetweenStartDateAndPreviousFirstDayOfWeek);
        }
        else
        {
            firstDayOfWeekBeforeStartDate = periodStart.AddDays(-(daysBetweenStartDateAndPreviousFirstDayOfWeek + DAYS_IN_WEEK));
        }

        DateTime lastDayOfWeekAfterEndDate;
        int daysBetweenEndDateAndFollowingLastDayOfWeek = (int)LAST_DAY_OF_WEEK - (int)periodEnd.DayOfWeek;
        if (daysBetweenEndDateAndFollowingLastDayOfWeek >= 0)
        {
            lastDayOfWeekAfterEndDate = periodEnd.AddDays(daysBetweenEndDateAndFollowingLastDayOfWeek);
        }
        else
        {
            lastDayOfWeekAfterEndDate = periodEnd.AddDays(daysBetweenEndDateAndFollowingLastDayOfWeek + DAYS_IN_WEEK);
        }

        int calendarWeeks = 1 + (int)((lastDayOfWeekAfterEndDate - firstDayOfWeekBeforeStartDate).TotalDays / DAYS_IN_WEEK);

这篇关于获得C#2日期之间的日历周数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆