No.3ベストアンサー
- 回答日時:
★アドバイス
・一般的に次の方法を取ります。
(1)年月日を西暦1年1月1日からの経過日数に変換
(2)経過日数に(期間の)日数を加算/減算
(3)西暦1年1月1日からの経過日数を年月日に変換
このうち(3)が最も面倒な作業になります。多分。
下に(3)だけですがサンプルを載せておきます。
サンプル:
// 閏年の判定
int isLeapYear( int year )
{
if ( !(year % 3200) ) return 0;
if ( !(year % 400) ) return 1;
if ( !(year % 100) ) return 0;
return !(year & 0x3);
}
// 経過日数から年月日を求める
int sample3( int days, int *year, int *month, int *day )
{
static int table[ 13 ] = {
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
}; int Y, M, D, ddd;
// [日]コピー
D = days;
// [年]算出
for ( Y = 1 ; D > (ddd = (isLeapYear(Y) ? 366 : 365)) ; Y++ ){
D -= ddd;
}
// [月]算出
table[ 2 ] = ((ddd == 365) ? 28 : 29);
for ( M = 1 ; D > table[M] ; M++ ){
D -= table[ M ];
}
// セット
*year = Y;
*month = M;
*day = D;
return days % 7; // 曜日を返す(0-6)
}
その他:
・上記のソースは『経過日数を年月日に変換』する考え方のサンプルです。
そのため計算スピードが低速で実用にはなりません。
その代わりに正しく変換してくれます。
答え合わせようの関数です。
・実際に利用するためには『年の算出』を除算と剰余を使って計算させます。
考え方は
(1)経過日数から3200年間の日数(1168776日)を幾つ引けるかを除算で求める。
(2)(1)のあまりの経過日数から400年間の日数(146097日)を幾つ引けるかを除算で求める。
(3)(2)のあまりの経過日数から100年間の日数(36524日)を幾つ引けるかを除算で求める。
(4)(3)のあまりの経過日数から4年間の日数(1461日)を幾つ引けるかを除算で求める。
(5)(4)のあまりの経過日数から1年間の日数(365日)を幾つ引けるかを除算で求める。
(6)(1)-(5)までで求めた除算の商と年数を掛けて加算すると『年』が求まる。
(7)(5)のあまりが年内の1月1日からの通算日数となります。これを『月』『日』に分ける。
・詳しい解説などは下の『参考URL』をどうぞ。
そこで紹介している『経過日数から年月日と曜日を求める』なら実用的なスピードで
計算してくれます。ただし有効範囲は3199年までです。3200年以降は1日ずつずれます。
これは3200年以降の閏年を考慮していないためです。でも誤差1日ですが。
・以上。
参考URL:http://cl.is.kyushu-u.ac.jp/Literacy/PP/H14/adp/ …
No.5
- 回答日時:
#3 Oh-Orange さん.
> 3200年以降の閏年
グレゴリオ暦に「3200年ごとの閏年」は存在しません.
グレゴリオ暦は400年周期です.
閏年と旧暦について (国立天文台)
http://www.nao.ac.jp/koyomi/topics/html/topics19 …
グレゴリオ暦 (Wikipedia)
http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC% …
「3200年閏年説」の発端は,グレゴリオ暦と太陽年の誤差にあると
考えて間違いないでしょう.
1太陽年 (平均回帰年) は365.2422日ですが,グレゴリオ暦の1年は
平均で 365 + 1/4 - 1/100 + 1/400 = 365.2425 日なので少し
誤差があります.
そこでグレゴリオ暦の平均年を太陽年に一致させるために,3200年
および80000年ごとの閏年の規則を追加すると「仮定すると」,
365 + 1/4 - 1/100 + 1/400 - 1/3200 + 1/80000 = 365.2422
となってピッタリになります.
ただし以上はあくまでも仮定の上での計算ですし,実際には地球の
自転はわずかずつ遅くなっているので,1太陽年も次第に長くなって
いるそうです.だから仮に3200年の規則があったとしても,それが
発動する頃には無意味になってしまっているどころか,発動すること
で却って誤差を大きくしてしまうでしょう.
(3200年+80000年規則により太陽年を逆に「縮めてしまう」わけですから.)
実際には,グレゴリオ暦と実際の太陽年の間の調整は「閏秒」で行います.
原子時計の時刻 (協定世界時 UTC) と地球の自転に基づく世界時 (UT1)
との間の誤差が常に±0.9秒以内になるように,必要に応じて1秒を挿入
または削除します.
閏秒は必要に応じて随時挿入/削除されるため,事前に計算することは
できません.当然,暦の規則とも無関係です.
(2004年のスマトラ島沖大地震も,地球の自転速度に影響を与えたそうです.)
国立天文台 アストロ・トピックス (167)
7年ぶりの「うるう秒」
http://www.nao.ac.jp/nao_topics/data/000167.html
閏秒 (Wikipedia)
http://ja.wikipedia.org/wiki/%E9%96%8F%E7%A7%92
そういうわけで,#3 の参考 URL のアルゴリズムに間違いはないはずです.
(細かくは見てませんが.)
ただし,せっかくアルゴリズムの説明にガウス記号 [x] (=床(floor)関数) を
使って正しい計算式を示しているにもかかわらず,Cのソースではそれが
単なる / 演算子になっているので,y<0 のとき結果が正しいかどうかは
処理系依存です (おそらく正しくない場合が多い).
床関数 (Wikipedia)
http://ja.wikipedia.org/wiki/%E5%BA%8A%E9%96%A2% …
No.4
- 回答日時:
2038年問題は、time_tが従来の32bitの場合に発生する問題です。
処理系依存で、すでに64bitに以降したものも多くあるようです。
たとえば
MS VisualC++では、2005以降はすでに64ビットに以降済みだそうです。
質問者の処理系がなにかはわかりませんが、最新版にアップグレード
するか、有償のものであればベンダーに問い合わせみてはいかがでしょうか?
参考URL:http://ja.wikipedia.org/wiki/2038%E5%B9%B4%E5%95 …
No.2
- 回答日時:
ユリウス日 (または姉妹品) ⇔ グレゴリオ暦相互変換の計算式やソースを
公開しているサイトはいくつもあるけど,そのアルゴリズムを説明している
サイトってほとんど見あたらないんですよね….
(私の探し方が悪いだけ?
まあ,昔自分で考えたからそこまで必死に探す気もないんだけど.)
> 2038年以降の日付
ということなので今回の質問には関係ないんですが,
公開されているソースの中には紀元前の日付を正しく計算できない
(作者がそこまで仕様に入れていない?) ものも多いので,
そういう用途に使う場合には注意してくださいね.
(検索する場合にはキーワード "floor" を追加するといいと思います.)
> 参考になるようなサイト、
アルゴリズムの説明ならば,
グレゴリオ暦/ユリウス暦 ⇔ ユリウス日 (または一般の通算日数) 変換アルゴリズム
http://www5d.biglobe.ne.jp/~noocyte/Programming/ …
> およびサンプルプログラム
上のページのリンク集のいくつかにあったはず….
No.1
- 回答日時:
わかりやすいのは, 「ある日からの経過日数」(通日) を計算することでしょうね.
天文学的には「ユリウス通日」(JD) とか「修正ユリウス通日 (あるいは準ユリウス通日)」(MJD) を使うのが普通で, 検索すればいろいろあると思います. wikipedia にもあるので特に URL は示しません.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) DATE関数で指定する「日」のセルが関数の場合の対処法 5 2022/09/14 15:46
- Excel(エクセル) 【Excel質問】 「本日の日付」から指定条件を満たす営業日経過後の日数を表示させる関数式 3 2022/06/06 23:28
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(Microsoft Office) 従業員増減対応で当番種類の増減対応な当番表 21 2022/07/19 07:30
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- Excel(エクセル) 年間仕事用シフトカレンダーに、日勤 夜勤 休み に色分けをした。 4 2022/12/09 04:12
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- 高校 日商簿記3級の勉強中なのですが 精算表が完成せず困っています。 こちらの問題の回答を教えていただきた 2 2023/03/02 09:07
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
このQ&Aを見た人はこんなQ&Aも見ています
-
それもChatGPT!?と驚いた使用方法を教えてください
仕事やプライベートでも利用が浸透してきたChatGPTですが、こんなときに使うの!!?とびっくりしたり、これは画期的な有効活用だ!とうなった事例があれば教えてください!
-
フォントについて教えてください!
みなさんの一番好きなフォントは何ですか? よく使うフォントやこのフォント好きだなあというものをぜひ教えてください!
-
2024年に成し遂げたこと
今年も残すところわずか。 皆さんが今年達成したことを教えていただきたいです。 どんな小さなものでも構いません。
-
集合写真、どこに映る?
あなたが集合写真を撮られるとき、画角のどのあたりにいることが多いですか? 私は振り返ってみると右の端にいることが多い気がします。
-
【穴埋めお題】恐竜の新説
【大喜利】 考古学者が発表した衝撃の新説「恐竜は、意外にもそのほとんどが〇〇〇」 (〇〇〇に入る部分だけを回答して下さい)
-
初級者の質問――time_tについて
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
有効数字について 以前質問をし...
-
O(n log n)について2
-
ExcelでPC(パソコン)によって...
-
数値の誤差
-
べき指数の求め方
-
2進数データのビット演算
-
時刻の比較
-
C言語で確実に論理右シフトをす...
-
VBAのINT関数について
-
VB.net Double と...
-
【C言語】RGBと輝度の計算に関して
-
色の判定
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
Enterキーを押されたら次の処理...
-
2÷3などの余りについて
-
中学生で数学です。 √84nが自然...
-
visualstudio C# テキストボッ...
-
シェルピンスキーのギャスケット
-
C言語 エラーの原因がわからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
有効数字について 以前質問をし...
-
VB.net Double と...
-
16進数 加算 減算 C言語
-
三菱シーケンサ(Aシリーズ)で...
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
除算を使わずに10で割りたい。
-
VBAでミリ秒まで出力する方法
-
2進数の足し算(C言語)
-
EXCELの関数"STDEV(標準偏差)"...
-
ExcelでPC(パソコン)によって...
-
計算の丸め誤差の解消について
-
”/”を使わずに割り算したいんで...
-
floatの有効桁数
-
100桁の計算ができなくて困って...
-
時刻の比較
-
距離から緯度経度を求める方法
-
どんな数字を入力してもaverage...
-
VB6.0での小数点の扱いについて
おすすめ情報