質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

6回答

11199閲覧

日付の差を求めるプログラム

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/08/07 10:44

とても悩んでいます、1990年6月6日~1992年4月3日までの日数などを求めるプログラムなのですが、任意の年月日で求めれるようにしたいのですが、一年間の各月は日にちがバラバラじゃないですか?30の時もあるし29の時もある、そこの対応方法が浮かんでこなくて
いい案のある方回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ベストアンサー

こんにちは。

tm構造体に日付時刻を設定して、mktime()でtime_tへ変換後、difftime()で2つのtime_t間の秒数が求まりますから、後は(3,600*24)で割れば日数がでます。

投稿2018/08/07 11:05

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/07 11:36

大変申し訳ありませんが詳しく教えてほしいです 僕にはまだわからないようで、、、。 あと、なぜ(3600*24)で割るのかも教えてほしいです。 よろしくお願いします
pepperleaf

2018/08/07 11:51

3600*24 => 60(分) x 60(秒) x 24(時間) time_t間 で得られるのは、 秒数なので、上記で割る。
Chironian

2018/08/07 12:31

これ以上詳しくについては範囲が広すぎて回答困難です。まずは検索して調べてみて下さい。多数の解説サイトがありますので。その上で分からない部分が残るようでしたら、その点をピンポイントで新たに質問を立てることをお勧めします。 次に「なぜ(3600*24)で割るのか」についてはpepperleafさんにフォロー頂いている通りです。
退会済みユーザー

退会済みユーザー

2018/08/07 13:19

わかりました
guest

0

参考情報

  • 3.基準日時からの通算日数(または秒数など)を求める

http://home.a00.itscom.net/hatada/c-tips/datetime.html

  • 経過日数の計算

https://ufcpp.net/study/algorithm/o_days.html

投稿2018/08/07 16:35

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もしかして単なる日数ではなく、「○年△ヶ月□日」のように出したい、のでしょうか?

その場合、Ya年Ma月Da日~Yb年Mb月Db日とすると、

  1. まず Db-Da を求める。ただしその結果が0以下だった場合は、Mbを一減らし、Yb年の(Mb-1)月の日数を結果に加算する。もし元のMbが1だった場合は、Ybから1減らしてMbに12を加算してから処理する。
  2. 次に Mb-Ma を求める(ただしMb の値は、1. の結果によって減算されていることに注意)。結果が0以下の場合も同様にYbから1減算してMbに12を加算して処理する。
  3. 最後にYb-Yaを計算する。

要するに桁上がり・桁下がりを年月日に合わせて考慮して処理する、のです。

投稿2018/08/07 15:00

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まずは、任意の日付の、西暦1年1月1日からの経過日数を求める関数を組みましょう。
次に、経過日数を与えたら、日付が出る関数を組みましょう。
「C言語 万年カレンダー」あたりでぐぐると記事が見つかると思います
また、「C言語 うるう年」なんかでぐぐっても参考になると思います

さて、その2つの関数が出来上がれば、質問の問題を解決することができますね
双方の日付の経過日数を求めれば、その日差はすぐに求まります

投稿2018/08/07 13:54

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

最初の年と最後の年以外はうるう年の判定をして、それに応じて足していく。(特殊な年も考慮する)
最初の年と最後の年は月ごとに日数を判別
2,4,6,9,11が31日がない月で、2月の特殊なもの以外は30日、2月はうるう年の条件で変更する。

どの言語かわかりませんが、この方法であれば、文章量は多くなりますが、結構簡単に実装できると思います。

最近の小学校では、にしむくさむらい(2、4、6、9、11)を教えてもらえないので、自分も苦労した思い出があります。

投稿2018/08/07 12:44

rainysk

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

UNIX Timeで計算して適時文字列に変換して下さい。

投稿2018/08/07 11:01

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問