高级javascript日期范围功能,可调整参考开始月/期间范围

时间:2012-11-20 20:58:35

标签: javascript jquery math datetime

Tricky解释这一点,但是找到最简单的方法可能是一个有趣的挑战,我昨天花了几个小时试图重构一个.NET C#代码,但没有提出任何优雅。

任何拥有良好的JavaScript,数学,日期问题解决头的人都可能有一个很好的灯泡时刻!!

我基本上需要能够为日期范围生成开始(和结束)。即过去12个月,过去6个月,过去24个月等。

但这不仅仅是一个简单的CurrentDate减去年份类型问题。

我们使用期间范围来显示我们呈现的数据,即每月,每两个月,每季度,每半年。但我们也有一个参考月份,其中期间范围应该基于,即期间范围应始终从7月开始。因此,无论当前日期如何等,从7月1日开始到9月30日,你总能得到一个干净的季度。

考虑到这一点,我们总是希望开始日期考虑此引用,引用将始终只是一个月,所以所有开始日期将是一个月的第一天。结束日期将是一个月的最后一天,因为我们希望最终期间范围包括今天的日期,因此我们希望最终期间范围包括今天的日期。(/ p>

所以我们需要一个你可以传入的函数(我已经包含了样本值):

currentDate = 21 NOV 2012
dateRangeInMonths = 12 (Year)
periodRangeInMonths = 3 (Quarterly)
periodRangeReferenceStartMonth = 7 (July)

上述答案如下,因为它符合以下范围:

01 JAN 2012 - 31 MAR 2012
01 APR 2012 - 31 JUN 2012
01 JUL 2012 - 30 SEP 2012
01 OCT 2012 - 31 DEC 2012

returns startDate = 01 JAN 2012
returns endDate = 31 DEC 2012

所以这是正确的,因为我们的期间开始与7月的参考月一致,我们将今天的日期包括在最终范围内。

显然,前几年也需要重叠。另一个例子可能是:

currentDate = 10 FEB 2012
dateRangeInMonths = 6 (Half Year)
periodRangeInMonths = 2 (Bimonthly)
periodRangeReferenceStartMonth = 1 (Jan)

答案:

01 SEP 2011 - 31 OCT 2011
01 NOV 2011 - 31 DEC 2011
01 JAN 2012 - 29 FEB 2012

returns startDate = 01 SEP 2011
returns endDate = 29 FEB 2012

此外,如果它有任何帮助,这是一个c#位代码,它可以做我想要的但远非优雅,并且依赖于循环时间等等。所以你可能只想忽略它哈哈。

if (this.PeriodRangeInMonths > 1)
{
    this.StartDate = new DateTime(DateTime.Now.Year, this.PeriodRangeReferenceStartMonth, 1).AddMonths(0 - this.DateRangeInMonths);
    var temp = DateTime.Now.AddMonths(0 - this.DateRangeInMonths).AddMonths(this.PeriodRangeInMonths);
    while (this.StartDate.AddMonths(this.PeriodRangeInMonths) < temp)
        this.StartDate = this.StartDate.AddMonths(this.PeriodRangeInMonths);
}
else this.StartDate = new DateTime(DateTime.Now.AddMonths(1).Year, DateTime.Now.AddMonths(1).Month, 1).AddMonths(0 - this.DateRangeInMonths);
this.EndDate = this.StartDate.AddMonths(this.DateRangeInMonths);

我也愿意使用任何可能有用的第三方jquery库,包括数学或日期函数等。

1 个答案:

答案 0 :(得分:0)

我想我已经算了数学:http://jsfiddle.net/GNn7y/1/

这是一个javascript解决方案,但这不应该太难以适应另一种语言。

function getDateRange(refDate, monthRange, periodMonths, startMonth) {
    var datePeriodOffset = Math.floor((refDate.getMonth() - startMonth)/periodMonths);
    var endMonth = startMonth + datePeriodOffset*periodMonths - 1 + periodMonths;   
    var endDate = new Date(refDate.getFullYear(), endMonth+1, 0);  // the 0 sets it to the last day of the previous month (endMonth)
    var startDate = new Date(endDate.getFullYear(), endDate.getMonth() - monthRange + 1, 1);

    return {
        start : startDate,
        end : endDate
    };
}