0

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

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

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

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

我们使用周期范围来可视化我们呈现的数据,即每月、每双月、每季度、每半年。但我们也有一个参考月份,周期范围应从该参考月份开始,即周期范围应始终从 7 月开始。因此,从 7 月 1 日到 9 月 30 日,无论当前日期如何等,您总是会得到一个干净利落的季度。

考虑到这一点,我们总是希望开始日期考虑这个参考,参考总是一个月,所以所有开始日期都是一个月的第一天。结束日期将是一个月的最后一天,仅供参考,大部分时间实际上是在当前日期之后,因为我们希望最终期间范围包括今天的日期。

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

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

此外,如果它有任何帮助,这是 ac# 代码,它可以满足我的要求,但远非优雅,并且依赖于及时循环等。所以你可能想忽略它哈哈。

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);

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

4

1 回答 1

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
    };
}
于 2012-11-20T23:34:09.547 回答