0

Financial Quarters は常に月の 1 日に始まり、常に 3 か月間であると仮定します。

組織によって会計年度 (FY) の開始月は異なります。4 月 1 日、7 月 1 日、または 1 月 1 日 (通常の暦四半期と一致します) の場合もあります。

会計年度が始まる日付と月が与えられた場合、その日付が属する四半期の開始をどのように判断できますか。

例えば

DateTime getStartOfFinancialQtr(DateTime date, int monthFinancialYearStartsOn)

会計年度が 1 月に始まる 1 月 15 日 = 1 月 1 日

getStartOfFinancialQtr(new DateTime(2013,1,15), 1) == new DateTime(2013,1,1)

会計年度が 4 月に始まる 8 月 15 日は 7 月 1 日になります

getStartOfFinancialQtr(new DateTime(2013,8,15), 4) == new DateTime(2013,7,1)

ただし、会計年度が 2 月に始まる 2013 年 1 月 15 日は、2012 年11 月 1 日になります。

getStartOfFinancialQtr(new DateTime(2013,1,15), 2) == new DateTime(2012,11,1)
4

4 に答える 4

6

次の解決策は、私が考えることができる最も単純な実装であり、不必要なループなしで機能します。

DateTime getStartOfFinancialQtr(DateTime date, int monthFinancialYearStartsOn)
{
    var actualMonth = date.Month;
    var financialYear = date.Year;
    var difference = actualMonth - monthFinancialYearStartsOn;
    if(difference < 0)
    {
        --financialYear;
        difference += 12;
    }
    var quarter = difference / 3;

    return new DateTime(financialYear, monthFinancialYearStartsOn, 1).AddMonths(quarter * 3);
}
于 2013-07-16T18:49:24.987 に答える
3

Time Period Library for .NETのYearクラスを使用できます。

// ----------------------------------------------------------------------
public void FiscalYearRange()
{
  // calendar
  TimeCalendar fiscalYearCalendar = new TimeCalendar(
    new TimeCalendarConfig
      {
        YearBaseMonth = YearMonth.April,
        YearType = YearType.FiscalYear
      } );

  // time range
  TimeRange timeRange = new TimeRange( new DateTime( 2007, 10, 1 ), new DateTime( 2012, 2, 25 ) );
  Console.WriteLine( "Time range: " + timeRange );
  Console.WriteLine();

  // fiscal quarter
  Console.WriteLine( "Start Quarter: " + new Quarter( timeRange.Start, fiscalYearCalendar ) );
  Console.WriteLine( "End Quarter: " + new Quarter( timeRange.End, fiscalYearCalendar ) );
  Console.WriteLine();

  // fiscal year
  Year year = new Year( timeRange.Start, fiscalYearCalendar );
  while ( year.Start < timeRange.End )
  {
    Console.WriteLine( "Fiscal Year: " + year );
    year = year.GetNextYear();
  }
} // FiscalYearRange
于 2013-07-31T13:13:37.200 に答える
3

これほど簡単ではありませんか?これに何か欠けていますか?四半期は 3 か月の期間として定義されるため、指定された日付がどこにあるかを見つけて、その日付の指定された月に基づいて四半期が始まる場所を計算するだけです。

public DateTime GetStartOfFinancialQtr(DateTime dtGiven, int startMonth) {
    DateTime dtQuarter = new DateTime(dtGiven.Year, startMonth, 1);

    // Start Q is less than the given date
    if(startMonth > dtGiven.Month) {
        while(dtQuarter > dtGiven) {
            dtQuarter = dtQuarter.AddMonths(-3);
        }
    }
    // Start Q is larger than the given date
    else {
        while(dtQuarter.Month + 3 <= dtGiven.Month) {
            dtQuarter = dtQuarter.AddMonths(3);
        }
    }

    return dtQuarter;
}

以下は私が実行したテストです:

Console.WriteLine(GetStartOfFinancialQtr(new DateTime(2013, 1, 15), 1).ToString());
Console.WriteLine(GetStartOfFinancialQtr(new DateTime(2013, 8, 15), 4).ToString());
Console.WriteLine(GetStartOfFinancialQtr(new DateTime(2013, 1, 15), 2).ToString());

コンソール出力:

01/01/2013 000000
07/01/2013 000000
11/01/2012 000000
于 2013-07-16T18:00:50.813 に答える