• ベストアンサー
  • 困ってます

日付と曜日から、1週間前(7日前)の日付を算出するプログラム

ツェラーの公式を用いて、日付(年月日)から曜日を算出する方法があります。 例えばY年M月D日の曜日は、下式で求められます。 (Y + Y/4 - Y/100 + Y/400 + (13*M + 8)/5 + D) % 7 *但し、1月・2月は、前年の13月・14月とする。 *答えは0=日曜~6=土曜 これを応用して(別に応用しなくても良いんですが・・・)日付と曜日から、1週間前の同一曜日の日付を求めるプログラムを考えております。 例) 入力:2005年9月21日、水曜日 出力(解):2005年9月14日 この例は非常に簡単に求められますが、完全汎用型のプログラムを考えております。 しかし、なかなか良い知恵が出ません!! どなたかご教示頂けると助かります。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数1111
  • ありがとう数4

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

  • ベストアンサー
  • 回答No.1
  • Tacosan
  • ベストアンサー率23% (3656/15482)

yyyy年mm月dd日の 1週間前の日を求める, 手抜きな方法: 1. dd から 7 を引く 2. 1 の答が 0以下になったら mm から 1 を引き, (更新後の) その月の日数を dd に足す 3. mm が 0 になったら yyyy から 1 を引き mm を 12 にする 真面目にやると面倒なので, 一旦ユリウス通日にしてから 7 を引いて戻すのがよいかと.

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 まず最初に、その方法を考えました。 やはり一番素直で簡素な回答ですよね? 月毎の末日はテーブルに入れておき、参照するようにすれば良いですね。 この方法でも試してみます。 ありがとうございました!

関連するQ&A

  • 曜日を調べるプログラムが分かりません!!

    学校の課題がでたのですが、全く分かりません↓↓ [課題] 1990年1月1日以降の年月日をキーボードから入力すると、 それが何曜日かを表示するプログラムを作りなさい。 ※1990年1月1日は月曜日である ※うるう年の条件  「4の倍数で、100の倍数ではない」あるいは  「400の倍数である」 ※switchを使用すること どなたか分かる方教えてください。 よろしくお願いします。

  • エクセルで曜日を表示させるには

    左から右に1(曜日)2(曜日)と表示させるのに ="1("&WEEKDAY(DATE(年月日!A1,年月日!A2,年月日!A3))&")" の式が入っています。 WEEKDAYのところをMONTHにしたら月を表示するのですがWEEKDAYにしたら数値しか帰ってきません。書式設定でaaaとしてもだめです。 よろしくお願いします。

  • 日付を入力すると曜日が返ってくるプログラム

    タイトルのどうり、日付を入力すると曜日が返ってくるperlを作りたいのですが、なかなか良いアイデアが出てきません。 どなたか知恵をお貸し下さい。 具体例としては $a =&Youbi($year,$month,$day); とすると$aに"金"とか"月"といった値が返ってくるような感じでやりたいです。 お願いします。

    • ベストアンサー
    • Perl

その他の回答 (3)

  • 回答No.4
  • jacta
  • ベストアンサー率26% (845/3158)

> 完全汎用型のプログラムを考えております。 完全汎用型というのはどんなものを想定していますか?一般的な意味で解釈すると、完全に汎用のものを作ることはかなり難しいと思います。 まず、グレゴリオ暦が採用されたのは(本能寺の変が起きた)1582年からですが、各国によって実際の導入時期はまちまちで、日本では1873年から導入されました。これを反映するには、ロケールに応じてユリウス暦とグレゴリオ暦を切り替えることになりますが、日本のように太陰太陽暦を用いていた国などではエラーにするしかないと思います。 また、曜日の概念が導入されたのは321年のコンスタンティヌス帝時代のローマですが、他の国の導入時期を正確に把握するのは困難です。 さらに、グレゴリオ暦(というより協定世界時)は、未来永劫修正なしで済ませられるほど、精度が高いわけでもありません。何万年後か知りませんが、必ず何らかの補正が必要になることでしょう。しかし、現在の我々には、未来の暦法を知るすべなどありません。 もし、単に最近の年代だけを扱えばよいのであれば、mktimeを使えば簡単にできます。 struct tm t; t.tm_year = -1900 + 2005; t.tm_mon = -1 + 9; t.tm_mday = 21; t.tm_hour = 0; t.tm_min = 0; t.tm_sec = 0; t.tm_isdst = -1; t.tm_mday -= 7; /* 1週間前 */ if (mktime(&t) == (time_t)-1)  fputs("エラー\n", stderr); puts(asctime(&t));

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 すいません、完全汎用型というのは大袈裟な表現でした。 その時代まで遡って正常に動くものは考えておりません。 過去100年間程度正常に動くもの、と考えています。 他の方のも参考に、出来るような気がしてきました。 ありがとうございました!

  • 回答No.3

だいたいはNo.1の回答で説明されていますが、困っているのは「3月1日~3月7日の1週間前」だと思います。 この期間は、閏年の関係で「2月末日」が何日かを計算する必要がありますので。 閏年は、 「年を4で割って割り切れる年」かつ ←条件1 「但し、100で割って割り切れる場合は除外」かつ ←条件2 「但し、400で割って割り切れる場合は除外しない」 ←条件3 と言う判定を行って計算します。 ツェラーの公式の Y + Y/4 - Y/100 + Y/400 の部分が、この判定に相当します。 正しく判定出来たならば、 1896年 閏年 ←条件1に該当 1900年 通常年 ←条件2に該当 1904年 閏年  | 1996年 閏年 2000年 閏年 ←条件3に該当 2004年 閏年  | 2096年 閏年 2100年 通常年 2104年 閏年 と判定される筈ですので、ご自分で書かれた判定プログラムを試してみて下さい。 蛇足ですが、古い「カレンダーICチップ」の中には「年を4で割って割り切れる年が閏年」とだけ計算していて、2つの例外条件を無視しているICチップがあります。 なぜなら、その条件のみで「1901~2099年」の約200年間は正しく動くからです。 コストダウンの為だと思いますが「どうせ2100年が来る前に耐用年数を超して壊れるだろう」と言うのもあったのでしょう。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 閏年の判定方法をご教示頂き、感謝致します。 参考にさせて頂きます。 確かに常識的な期間だけ正常に動けばいいや!と考えますね(^◇^;) ありがとうございました!

  • 回答No.2

回答と言うよりヒントですが…… まず、大抵の処理系には、「日付・時刻」を管理するクラスがあります。これまた大抵、「日付の連番」と「年月日それぞれの値」が使えますので、 ・年月日→連番に変換 ・連番になった状態で、7日分をマイナス ・それをさらに、年月日に戻す。 という手があります。 No.1 の形の回答にある、ユリウス通日に戻すのも同じ考え方です。 標準のCのライブラリの範囲では、time.h というヘッダに、一式関数が入っていますので、じっくり眺めれば使えると思います(使ったことはありません・いつも、処理系についているクラスを使っているので)

参考URL:
http://wisdom.sakura.ne.jp/programming/c/c60.html

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 連番でやる方法もあるんですねー。 全く考えもしませんでした。 面白そうなので、ヒントを参考に考えてみます。 組み込み機器のプログラムなのでライブラリは極めて少なく、 かつコードをスリム化するために使用出来ないのです(>_<) 言葉足らずで申し訳ありませんでした!

関連するQ&A

  • EXCELの日付

    EXCELの日付表示で、年月日時間は書式から選択できるのですが、曜日をあらわすにはどうすればいいのですか?

  • 曜日を求めるプログラムはどうやるの?

    ただいま、C言語に苦戦中です。教えてください 2001年の月日の入力データから、曜日を求めるプログラム。 (実行結果例) 月を入力してください: 9↓ 日を入力して下さい : 15↓ 9月15日は土曜日です。

  • EXCEL:日付を数値に変換したい

    こんばんは。 EXCELで日付を変換する方法を教えてください。 例)20090617→6   20090701→7   20100530→5 と云う様に年月日の「月」の部分を整数で表したいです。 2009/06/17のように区切りが無い為、非常に厄介です(/_;) どうぞ宜しくお願い致します。

  • ポインタと整数との比較を行なっていますとは?

    題名通り、「ポインタと整数との比較を行なっています」とはどういう意味でしょうか?この解決策を教えてください。 ちなみに今、ツェラーの公式で年月日から曜日を得るという関数作成をしています。。

  • VB.net2010 曜日の取得について

    初心者ですが、失礼します。 VB.net2010にて コンボボックス4つ (「20」「00」年「04」月「02」日の「」の4つ) に任意の日付を入れてその日の曜日を分かるようなコードを組みたいのですが、 weekdayname関数とコンボボックスの合わせ方がイマイチ分かりません。 宜しくお願い致します。 1. コンボボックス4つの年月日を選択してボタンを押す 2.メッセージボックスに曜日を表示する

  • ACCESS97で現在の日付から勤続年月数を算出する関数

    ACCESS97で社員名簿を作っています。 現在の日付から年齢を算出する関数は調べたところ次のようにすればよいとわかりました。 IIf(Right(Format([生年月日],"yyyy/mm/dd"),5)>Right(Format(Now(),"yyyy/mm/dd"),5),DateDiff("yyyy",[生年月日],Now())-1,DateDiff("yyyy",[生年月日],Now())) 次は現在日から入社年月日フィールドにあるデータを使い、勤続年数○年○ヶ月というクエリーを作りたいのですが、○ヶ月を算出する応用がわからずに困っております。 どうかよろしくお願いします。

  • ツェラーの公式について

    ツェラーの公式を用いて曜日を算出するプログラムを PL/Iで作成したいのです。 どのようにコーディングすればいいのか教えてください。 よろしくお願いします。

  • Excel関数:日付にナノ秒を足して年月日を求めるには?

    はじめまして、 日付にナノ秒を足して年月日を求める関数式を教えてください。例)日付“1601年1月1日”に長整数“128335644000000000”ナノ秒を足すと結果が年月日“2007年9月6日”と出るようにするにはどのような関数式が必要でしょうか。 宜しくお願いします。

  • エクセルにて年月日の平均を1列にて算出方法

    いつも御世話になっております。 標題の件ですが、どなたかエクセルに関して知識の有る方に質問させて下さい。 エクセルの1列のみに下記の様に年月日が入っており、 その年月日の平均日数を算出する方法を御教授頂きたく お願い致します。 ※セルには同じ月日が入力されている場合も有ります。 例: 受注日 12/12/21 12/12/28 12/12/28 14/01/17 14/01/17 14/01/31 例:結果 91日など この様な形にて算出したく、宜しくお願い致します。 m(__)m

  • 今日の日付から1週間のリスト

    PHPで現在の日付を受け取り1週間後までの日付を表示させるリストを作っています。 年月日すべてが表示されるようにしたいので(年はなくても可)今日であれば <select name=day> <option>2008/01/16</option> <option>2008/01/17</option> ・・・ <option>2008/01/23</option> </select> のように代入したいです。 date関数からdayだけに7を足しても月の変わり目で31日をオーバーしてしまうので <option>2008/01/31</option> <option>2008/02/01</option> と正しく表示させるにはどうすればいいでしょうか?

    • ベストアンサー
    • PHP