0

日付に月を足したり引いたりする数式を探しています。年と月だけを知る必要があるため、日は無視できます。

これは私が思いついた追加の月の疑似コードです:

OldYear = 2012 // current year
OldMonth = 3 // current month
AddMonths = 0 // the months to be added

FooBar = OldMonth + AddMonths

NewYear = OldYear + FooBar / 12
NewMonth = FooBar % 12

IF NewMonth = 0
    NewYear = NewYear - 1
    NewMonth = 12
END IF

// set AddMonths to 0 and the result will be 2012.03
// set AddMonths to 6 and the result will be 2012.09
// set AddMonths to 9 and the result will be 2012.12
// set AddMonths to 11 and the result will be 2013.02
// set AddMonths to 23 and the result will be 2014.02
// set AddMonths to 38 and the result will be 2015.05

それは本当にうまく機能しますが、もっと良い方法はありますか? IF NewMonth = 0 の再調整の必要性はあまり好きではありません。

しかし、私の実際の問題は、月を減算する対応する式を思いつくことができなかったことです。いろいろ試しましたが、どれもうまくいかず、気が狂ってしまいました。どんな助けでも大歓迎です!

4

3 に答える 3

2

@Mattの回答での私のコメントと@Mattの回答の組み合わせです

0 ベースの月スキームを採用すると、式を大幅に削減できます。

疑似コード:

year = 2012;  // year 2012
month = 6;    // July (NOT June)
monthToAdd = -20;  // +ve/-ve means add/subtract

resultYear = (year * 12 + month + monthToAdd) /12;
resultMonth = (year * 12 + month + monthToAdd) mod 12;

// resultYear == 2010
// resultMonth == 10  , which means November

編集:上記の元の回答は、ゼロベースの月スキームを想定していましたが、これは一部の人々に見落とされているようです. 混乱を避けるために、もちろん、より直感的な 1 ベースの月スキームを使用して、計算中に 0 ベースの変換を行うことができます (ただし、計算が少し面倒になります)。

year = 2012;  // year 2012
month = 7;    // July
monthToAdd = -20;  // +ve/-ve means add/subtract

resultYear = (year * 12 + (month - 1) + monthToAdd) /12;
resultMonth = ((year * 12 + (month - 1) + monthToAdd) mod 12) + 1

// resultYear == 2010
// resultMonth == 11  , which means November
于 2012-07-16T07:43:27.897 に答える
1

考えられる解決策の 1 つはOldYear、12 を掛けて (月に変換する)、AddMonthsまたはSubMonthsをそれぞれ加算または減算してから、整数除算と剰余除算を使用して元に戻すことNewYearですNewMonth(プログラミング言語によっては、これを単純化できる場合があります)。 )。

于 2012-07-16T07:35:23.337 に答える
-1

メイン ロジックを構築した Adrian Shum の功績に感謝しますが、現在の月と同じ月数をさかのぼる場合、コードが 100% 正確ではないというエッジ ケースがあると思います。たとえば、 3 月に 3 か月さかのぼると、12 月 (2 月、1 月、12 月) に終わるはずです。

変更されたバージョンは次のとおりです。

year = 2020;  
month = 4;    
monthToAdd = -1; 
resultYear = (year * 12 + month + monthToAdd) /12;
resultMonth = (year * 12 + month + monthToAdd) % 12;

if month+monthToAdd == 0:
    resultMonth=12

elif (abs(monthToAdd)%month)==0:
    resultMonth=month

print(resultMonth)
print(resultYear)
于 2020-12-21T23:36:17.247 に答える