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库,包括数学或日期函数等。
答案 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
};
}