解释这一点很棘手,但找到最简单的方法可能是一个有趣的挑战,我昨天花了几个小时试图重构一段 .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 库,包括数学或日期函数等。