3つの非負の整数を考えるとy、m、およびd(うち少なくとも一つが正でなければならない)と正の年と有効な日付(年、月、日を含む任意の合理的な形式であり、追加情報なし)、出力元の日付からy年、m月、d日後の日付。
グレゴリオ暦はすべての日付に使用されます(グレゴリオ暦の採用前の日付も含みます)。
次の日付の計算方法は次のとおりです。
- 追加
y年に m月に追加- ロールオーバーを適用して日付を正規化(例:
2018-13-01->2019-01-01) - 日が月の最終日を過ぎている場合は、月の最終日に変更します(例
2018-02-30->2018-02-28)。 d日に追加- ロールオーバーを適用して日付を正規化(例:
2019-01-32->2019-02-01)
うるう年(4で割り切れる年。ただし、400で割り切れる場合を除き、100で割り切れない年)は、適切に処理する必要があります。すべての入力と出力は、言語の表現可能な整数の範囲内にあります。
テストケース
テストケースは、JSONオブジェクトの形式input => outputで提供されinputます。
{"date":"2018-01-01","add":{"d":1}} => 2018-01-02
{"date":"2018-01-01","add":{"M":1}} => 2018-02-01
{"date":"2018-01-01","add":{"Y":1}} => 2019-01-01
{"date":"2018-01-30","add":{"M":1}} => 2018-02-28
{"date":"2018-01-30","add":{"M":2}} => 2018-03-30
{"date":"2000-02-29","add":{"Y":1}} => 2001-02-28
{"date":"2000-02-29","add":{"Y":4}} => 2004-02-29
{"date":"2000-01-30","add":{"d":2}} => 2000-02-01
{"date":"2018-01-01","add":{"Y":2,"M":3,"d":4}} => 2020-04-05
{"date":"2018-01-01","add":{"Y":5,"M":15,"d":40}} => 2024-05-11
このJSFiddleをテストに使用できます。
これはcode-golfなので、(各言語で)最短のソリューションが優先されます。
y、mそしてd(例えば、可能性がd2147483000も?)
All inputs and outputs will be within the representable integer range of your language.