いつもお世話になっております。
先日、『YYYY/MM/DD』形式から年・月・日を取り出し、整数にする質問をさせて頂き、無事に行うことができました。
ありがとうございます。
再びの質問で恐縮ですが、どうか教えてください。
先日の質問に引き続き、日付の妥当性をチェックする関数を考えています。そこで、「http://f4.aaa.livedoor.jp/~pointc/log453.html」というサイトを見つけたのですが…。
その中で、"20020101"という文字列を『strncat』で分割し、『atoi』してから『tm構造体』へ代入しています。
この『tm構造体』というものがよく分かりません。
調べて見ると、『time()』関数にて取得した暦を『localtime()』関数を使ってローカルタイムに変換し、その値が『tm構造体』となって戻ってくる。というようなことが書いてあります。(正しい理解ができているか、不安なところですが。)
なぜ、『tm構造体』へ代入しただけで、日付を算出できるのでしょうか?『tm構造体』は『localtime』関数の戻り値ではなく、単体で利用できるのでしょうか。他に関数というかライブラリ関数のようなものは見当りません。
『tm構造体』自体が計算か何かをしているのでしょうか?
乱文で申し訳ありません。
どうかご協力お願いいたします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
自前で日付の妥当性を判定する場合には、あらかじめ適用範囲を明確にする必要があります。
というのも、グレゴリオ暦が採用される時期は、宗教的・政治的な理由から、国によってまちまちだからです。例えば、グレゴリオ暦ができた頃(1582年)といえば、日本ではちょうど本能寺の変があった頃で、当然旧暦を使っていましたから、グレゴリオ暦のルールで妥当性を判定しても意味がありません。欧米でも、カソリック圏には比較的早く普及しましたが、プロテスタント圏への普及は1世紀以上遅れますし、ギリシャ正教圏がグレゴリオ暦に移行したのは日本より遅かったりします。また、イスラム圏などではそもそも別の暦法を使っています。
比較的最近の年代だけを扱うのか、あるいはロケールに応じて判定方法を変えるのかなど、暦の扱いは結構奥が深いのです。
jacta様
丁寧なご説明をありがとうございます!
『グレゴリオ暦』は世界共通ではないのですね。
"月"や"日"は決まっていますが、"年"の適用範囲は考えてみると本当に難しいです。
今回は最近の年代を扱えばよいと思うので、適用範囲を狭くしようと思います。
ご丁寧に教えていただき、本当にありがとうございました!
No.2
- 回答日時:
★自前関数でチェックしてみてはどうでしょうか?
・下にC言語を中心とした小技集のサイトを紹介します。
・下の『指定の年月日が有効であるか判定する』という項目を参考にして下さい。
参考文献:
・http://katsura-kotonoha.sakura.ne.jp/prog/c/tip0 …→『年月日から曜日を求める』
・http://katsura-kotonoha.sakura.ne.jp/prog/c/tip0 …→『指定の年が閏年かどうか判定する』
・http://katsura-kotonoha.sakura.ne.jp/prog/c/tip0 …→『指定の年月日が有効であるか判定する』
・http://katsura-kotonoha.sakura.ne.jp/prog/c/tip0 …→『指定の年月日がグレゴリウス歴の範囲内かどうか判定する』
参考URL:http://katsura-kotonoha.sakura.ne.jp/prog/c.shtml
Oh-Orange様
丁寧なご回答をありがとうございます。
早速『指定の年月日が有効であるか判定する』を拝見させていただきました。
『うるう年かどうか判定する』の関数もあり、とても勉強になります。
このような関数を自分で思い付けるようになりたいですが、まだまだ勉強が足りないようです。
これらの関数を使って、早速プログラムを作ってみたいと思います。
本当にありがとうございました。
No.1
- 回答日時:
tm構造体へ代入しただけでは日付の妥当性は判定できません。
取り上げられているサイトでは、mktime関数を呼び出すことで妥当性の確認を行おうとしているようですが、mktimeはtm構造体に変な値を格納していても勝手に補正してしまうので、妥当性の判定には使えません。また、日付としては妥当であっても、time_t型の表現範囲を超えていればエラーを返します。例えば、3000年1月1日などは、多くの処理系ではエラーになるはずです。jacta様
丁寧なご回答をありがとうございます!!
『mktime』という関数を使っているのですね。そんな関数があることも知りませんでした…。
『mktime』は変な値も勝手に補正しているとありますが、確かにそれでは妥当性をチェックできないですね。『mktime』を使う前に何かチェックを入れるべきなのでしょうか?
それとも別に方法があるのでしょうか?
重ねがさねで申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- JavaScript useStateの分割代入について 1 2022/05/06 10:02
- 哲学 説得力を修辞の巧みさまたは論理の強さの2つに分析するにはどうすると良いでしょうか? 0 2022/07/20 05:46
- 数学 【大至急】数学のレポートの問題なんですが分からないので是非教えていただきたいです!本当にお願いします 5 2022/07/25 06:52
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) 生産日報と月間集計 3 2022/06/21 22:32
- 会社・職場 Excel、Googleスプレッドシートなどへのデータ入力 2 2023/07/06 05:59
- 日本語 「~人」と「~名」の使い分け 2 2022/06/02 11:59
- その他(教育・科学・学問) 関数、写像について 1 2022/04/10 23:45
- Excel(エクセル) エクセル365の関数。誕生日表記がおかしい 2 2022/10/17 18:52
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
値が代入されてない時
-
VB.NETのStructureというのはど...
-
long型のデータをバイト型の配...
-
ユーザー定義型変数の一括初期化
-
異なる構造体のデータのコピー
-
VBAのコードで Dim Obj As Acce...
-
整数から16進数への変換 現在c...
-
charとucharの違い
-
構造体のデータを丸ごとコピー...
-
構造体の初期化方法について
-
命名規則 VB 構造体
-
aspでユーザー定義の構造体を作...
-
日付チェック関数について
-
構造体の代入と比較
-
関数から配列を返すには?
-
C言語 配列の長さの上限
-
先頭アドレスとは何ですか?
-
セグメントエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
C++ 構造体の一括初期化 {0}
-
long型のデータをバイト型の配...
-
「#undef」と「#define」の使い...
-
構造体のデータを丸ごとコピー...
-
VBAにてcolorindexを変数に格納...
-
C言語 構造体の中に共用体を定...
-
値が代入されてない時
-
異なる構造体のデータのコピー
-
typedefをプログラム中で解除す...
-
構造体のポインタにNULLが入らない
-
charとucharの違い
-
整数から16進数への変換 現在c...
-
VBAの変数のデータ型を変更する...
-
VB.NETのStructureというのはど...
-
構造体を型の異なる構造体に代入
-
日付チェック関数について
-
ユーザー定義型変数の一括初期化
-
構造体の初期化方法について
おすすめ情報