1

日付を指定して、現在の年間四半期を計算したいと思います。

今日の日付が指定された日付より大きい場合、指定された日付に基づいて現在の年次四半期の最後の月と、次の年次四半期の最初の月を計算したいと考えています。

私が活動している四半期は、1 月から 3 月、4 月から 6 月、7 月から 9 月、10 月から 12 月です。

日付入力が 2013 年 1 月 10 日である場合、出力を 1 月 (次の年次四半期の最初の月) と 12 月 (現在の年次四半期の最後の月) にしたいと考えています。この場合、月の変数には値 10 が含まれ、日の変数には値 1 が含まれます。

これまでの私の試み:

各四半期の最終月

if (month % 3 == 0)
  month += (DateTime.Now.Day > day ? 3 : 0);
if (month % 3 == 1)
  month += 2;
if (month % 3 == 2)
  month += 1;

各四半期の最初の月

if (month % 3 == 1) // jan/mapr/jul/oct
  month += (DateTime.Now.Day > day ? 3 : 0);
if (month % 3 == 2) // feb/may/aug/nov
  month += 2;
if (month % 3 == 0) // mar/jun/sep/dec
  month += 1;
4

6 に答える 6

5

整数演算を使用して現在の四半期を取得できます。

int currentQuarter = ((month-1)/3)+1;

これは、整数除算は常に切り捨てられるため、月が 1 から 3 の場合、0 に等しい 3 に対して 0 から 2 が得られます。月 4 から 6 は、3 に対して 3 から 5 が得られ、1 に等しくなります。

特定の四半期について、最初と最後の月は次の式で与えられます。

int firstMonthOfQuarter = (quarter*3)-2;

int lastMonthOfQuarter = (quarter*3);

quarterこれらの は、月が必要な四半期になることに注意してください。現在の四半期が必要な場合は、それを使用します。次の四半期が必要な場合はquarter+=1、オーバーフローをチェックします (つまり、四半期が 5 の場合、実際には 1 です)。%12または、最初と最後の月の計算に追加することもできます。その後、5 の四半期で問題なく機能します。

int firstMonthOfQuarterOfNextQuarter = (((quarter+1)*3)-2)%12;
int lastMonthOfQuarterOfNextQuarter = ((quarter+1)*3)%12;

現在の四半期 (最初の行で指定されているように) または場合によっては、次の四半期と現在の四半期の最初と最後の月が必要なため、これをどのようにまとめたいかについて少し混乱しています。これをどのように返すかはわかりませんので、自分で組み立てる必要があります。

于 2013-08-05T18:49:11.463 に答える
1

説明したように、このアルゴリズムは必要な機能を提供します。

int quarterCurr = 1;
if (Convert.ToDouble(curMonth) / 3.0 > 1.0)
{
    quarterCurr = Convert.ToInt32(Convert.ToDouble(curMonth) / 3.0);
    if (curMonth % 3 != 0)
    {
        quarterCurr = quarterCurr + 1;
    }
}
int firstMonthCurr = 3 * (quarterCurr - 1) + 1;
int lastMonthCurr = 3 * quarterCurr;

int quarterNext = quarterCurr + 1;
if (quarterNext > 4)
{
    quarterNext = 1;
}
int firstMonthNext = 3 * (quarterNext - 1) + 1;

これは、必要なすべての情報 (各四半期の最初/最後の月) を計算する簡単で明確な方法です。

このコードは、必要に応じて呼び出される関数に入れる必要があります。入力として現在の月だけを取り、出力として長さ 2 の 1D 配列を返します。現在の四半期の最後の月の最初の位置と次の四半期の最初の月の 2 番目の位置 (または任意の他の代替手段)。したがって、主要な機能 (任意の入力月の目標値を計算する) が含まれていますが、正確な要件に合わせて調整する必要があるのはユーザーです。

于 2013-08-05T18:50:05.337 に答える
0
var currentDate = DateTime.Now;
var quarterNumber = ((currentDate.Month-1)/3) + 1;
var firstDayOfQuarter = new DateTime(currentDate.Year, ((quarterNumber-1) * 3) + 1, 1);
var lastDayOfQuarter = firstDayOfQuarter.AddMonths(3).AddDays(-1);
于 2013-08-05T18:49:57.210 に答える