• ベストアンサー

あと何日or何日目?を計算する方法

課題でy年m月はd日あるという形のプログラミングがあったのですが、それを発展させてクリスマスまであと何日とか、生まれてから今日で何日たったというプログラムを作りたいと思いました。 似たような例がhttp://www.asahi-net.or.jp/~KC2H-MSM/excel/excel004.htmにありましたが、これをC言語で記述するとどのようになるのでしょうか。 AとBにあたる部分を西暦y年m月d日という形で入力して(Bは今日の日付でなくてもいいことにして)、Cにあたる部分を出力させるというのは分かりますが、先のプログラム(何月が何日あるというやつ)を使って、yを増やしていってdを足し続けることを何回も繰り返すのは無駄が多い気がするのでもっと有益な方法があるはずだと思って質問しています。

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

Cなら標準ライブラリに日付関数があります。 #include <time.h> /* 2001年1月1日から2004年4月28日までの日数をnissuに求める ** 1970年1月1日0時0分0秒~2038年1月19日3時14分7秒の範囲で使用 ** この範囲外だとmktimeがエラーになるので使えない事に注意 */  struct tm t1,t2;  int nissu;  t1.tm_year = 2001 - 1900; /* 2001年 */  t1.tm_mon = 1; /* 1月 */  t1.tm_mday = 1; /* 1日 */  t1.tm_hour = 0;  t1.tm_min = 0;  t1.tm_sec = 0;  t2.tm_year = 2004 - 1900; /* 2004年 */  t2.tm_mon = 4; /* 4月 */  t2.tm_mday = 28; /* 28日 */  t2.tm_hour = 0;  t2.tm_min = 0;  t2.tm_sec = 0;  nissu = (int)(difftime(mktime(&t2),mktime(&t1)) / 86400.0) + 1; 上記例は「過去の日付から今日まで何日」の場合です。 「クリスマスまであと何日」の場合は、クリスマス当日は「あと0日」にする必要があるので、最後の行を  nissu = (int)(difftime(mktime(&t2),mktime(&t1)) / 86400.0); と、1を足すのを削ります。

noname#82458
質問者

お礼

<time.h>っていうのがあるんですね。 そういえば<stdio.h>と<math.h>しか使ったことなかったです。

その他の回答 (2)

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.3

 標準関数による解法は、#1・#2の方が書いておられますので、標準関数を使わずに1から作ってみたいならということで。  この問題は、通常は、「何年何月何日」の形式の日付は直接計算しません。質問にも書いておられるとおり、結構面倒な事になりますので。  では、どうするかというと、一例は、日付をユリウス日に変換します。ユリウス日と言うのは、ある日付が、ユリウス暦BC4713年1月1日から数えて、何日たっているかを表した一つの実数です。(小数点以下は、時・分・・・となります。)(正式のユリウス日の定義は、こうなりますが、コンピュータでの日付計算では、別の基点を取ることもあります。)  この形に直してしまえば、質問の問題は、とっても簡単に解けます。単に引き算するだけです。何日後であれば、足し算すればokです。  ユリウス日と日時の変換アルゴリズムに関しては、「ユリウス日」をキーワードにして検索してみれば、いっぱい出てきますが、一例を参考URLにあげておきます。  ちなみに、標準関数などでの計算もこれと同じ考え方の計算方法をとっています。

参考URL:
http://web.kyoto-inet.or.jp/org/my-art/library/calsmpl/cldttojd.html
noname#82458
質問者

お礼

30年ぐらいまでではなくて紀元前から計算できるんですね。 標準関数を使わなくても計算できるんですね。

回答No.1

関数 mktime() により、指定した日時を1970/1/1からの通算秒数に変換できます。これを使ってください。

関連するQ&A