• ベストアンサー

関数を使わないで日付の計算をしたいのですが。

2007,7,5,4 年,月,日,曜日(0が日曜日) の入力から、+10日後の日付と曜日を求めたいのですが、 関数を一切使わず計算式と場合分けのみで計算する方法ありますか? 今考えている方法は、地道に、ある基準1970年1月1日をシリアル値で0としそこから、今日までの日数を1月は31、2月は28にちなどを考えてを足していき、シリアル値を算出。 そのシリアル値に+10した値を再び年月日曜日の形に戻す方法しか無いのかと考えています。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★最初に >関数を一切使わず計算式と場合分けのみで計算する方法ありますか?  ↑  あります。というか関数で記述することを記述すればよいだけ。  汎用性も考えれば専用の関数か、日付操作ライブラリを自作して使いまわした方が  良いと思いますよ。 >今考えている方法は、地道に、ある基準1970年1月1日をシリアル値で0としそこから、 >今日までの日数を1月は31、2月は28にちなどを考えてを足していき、シリアル値を算出。 >そのシリアル値に+10した値を再び年月日曜日の形に戻す方法しか無いのかと考えています。  ↑  私もこの方法しか思い浮かびません。  このときの注意点として『閏年』の判定、扱いをきちんと考えないと正確になりません。  表計算で有名な Excel について興味深い記事を見つけましたので読んで見て下さい。  http://pc.nikkeibp.co.jp/article/NPC/20070530/272938/→『DATEDIF関数の“受難” (第1回)』  ↑  3ページ目です。 >10日ではなくて10000日だったらどんな感じになりますか?  ↑  加減算する日付を西暦1年1月1日を1としたシリアル値に変換して加算、減算とするしかないかな。 ・開始日を Y1/M1/D1 とすると  days = ((Y1 * 365) + (Y1 / 4) - (Y1 / 400 * 3)) + FuncGetDays(Y1,M1,D1);  days += 10000; ←加算  days -= 10000; ←減算  この days のシリアル値を年、月、日に変換します。  ※FuncGetDays() 関数は年月日から1月1日の日数を計算する関数です。  ※この関数の詳しい内容は下の『参考URL』をどうぞ。回答者No.2です。  ※そのたも参考になります。 ・以上。

参考URL:
http://oshiete1.goo.ne.jp/qa3085731.html
issaon55
質問者

お礼

いや~、参考になりました。ありがとうございました。

その他の回答 (2)

回答No.2

10000日でも処理方法は変わりません。 1)単純に「日」に 10000を足す 2)その「日」の結果は、「月」に対して妥当か?    妥当ならそれが答 3)「日」から、その月の日数を引く   「月」をひとつ増やす 4)その「月」は妥当か?    妥当ならそれが答 5)月を1にして、年をひとつ増やす 7)2に戻る 8)終わり。

回答No.1

曜日が入力されるのであれば、曜日の処理は簡単ですね。 (そもそも、入力値は7種類しかない) 日付は 1)単純に「日」に 10を足す 2)その「日」の結果は、「月」に対して妥当か?   (ここで、「その月は何日あるか」がわかっている*はず*であることに注意)   妥当ならそれが答 3)「日」から、その月の日数を引く   「月」をひとつ増やす 4)その「月」は妥当か? 妥当ならそれが答 5)月を1にして、年をひとつ増やす 6)終わり。

issaon55
質問者

補足

ありがとうございます。曜日は簡単ですね。 2月25日の場合、年によってうるう年かどうか判定すればよいってことですね。 10日ではなくて10000日だったらどんな感じになりますか?