これを説明するのは難しいですが、最も簡単な方法を見つけるのは興味深い挑戦かもしれません。昨日、.NET C#のコードをリファクタリングしようとして数時間を費やしましたが、エレガントなものは何も思いつきませんでした。
したがって、JavaScript、数学、日付の問題解決に優れた頭を持っている人なら誰でも、電球の瞬間が良いかもしれません。
基本的に、日付範囲の開始(および終了)を生成できる必要があります。つまり、過去12か月、過去6か月、過去24か月など。
しかし、それは単純なCurrentDate減算年タイプの問題ではありません。
期間範囲を使用して、提示しているデータを視覚化します。つまり、月次、隔月、四半期、半年です。ただし、期間範囲の基になる参照月もあります。つまり、期間範囲は常に7月に開始する必要があります。したがって、現在の日付などに関係なく、7月1日から9月30日まで常にクリーンカット四半期を取得します。
そのことを念頭に置いて、開始日には常にこの参照を考慮に入れたいと考えています。参照は常に1か月であるため、すべての開始日は1か月の1日になります。最終期間の範囲に今日の日付を含める必要があるため、終了日は月の最終日になり、FYIはほとんどの場合実際には現在の日付より後になります。
したがって、渡すことができる関数が必要です(サンプル値を含めました)。
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);
また、数学関数や日付関数など、役立つ可能性のあるサードパーティのjqueryライブラリを使用することもできます。