0

これを説明するのは難しいですが、最も簡単な方法を見つけるのは興味深い挑戦かもしれません。昨日、.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ライブラリを使用することもできます。

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 に答える