• ベストアンサー

4バイト整数を使っているため

mktimeやlocaltimeなどはもうすぐやってくる2036年以降はオーバフローのため正しく機能しないようです これに対して対策したC言語関数は無いのでしょうか?

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

  • ベストアンサー
回答No.3

#2の者です。 2038年問題は、私も非常に関心を持っています。 「time(NULL) 2038」で検索してみました。 やはりtime()関数自体は2038年問題に対応していないようです。 下記のサイトに解説が載っています。 時間と2038年問題 http://www.birdport.jp/c-guide/lessons/28.htm _time64()という関数を見つけました。 下記のサイトを参照して下さい。 time、_time64 http://www.asia.microsoft.com/japan/msdn/library/ja/vclib/html/_CRT_time.asp?frame=true 下記のサイトも参考になります。 188707 - INFO年オーバーフローがVisual C++と2000年問題をそれによって発生します。 http://support.microsoft.com/default.aspx?scid=kb;JA;188707&Product=vcJPN KATA World ぷろぐらむ アーカイブ http://katakuri.sakura.ne.jp/~kata/archives/cat5/cat5.html 現在、特効薬がないか、調査中です。

keyguy
質問者

お礼

ありがとうございます #include <time.h> #include <stdio.h> #include <sys/types.h> #include <sys/timeb.h> #include <string.h> をつけても __time64_t __mktime64 __localtime64 などが未定義エラーになります Borland C++5.5.1(無償版)を使っていますがこれがいけないのかもしれません

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

WindowsのAPIは私が調べた範囲ではみつかりませんでした。 代わりにMFCにはCOleDateTimeというクラスがあり、このクラスでは2038年問題に対応しています。 ◆サンプルソース COleDateTime dateTest; dateTest = COleDateTime::GetCurrentTime(); CString strDate; strDate.Format("%d年%d月%d日" , dateTest.GetDayOfYear() , dateTest.GetMonth() , dateTest.GetDay()); SDKでプログラミングを組んでいるのであれば、COleDateTimeクラスを利用して、MFCで日付取得用の関数を呼び出せるDLLを作成しておくという手があります。 もしくは、MFCのCOleDateTimeクラスのソースを解読してどういった処理をしているかを調べる方法もあります。 私も、ソースを解読してみましたが、よくわかりませんでした。 COleDateTime::GetCurrentTime()関数の処理は、 COleDateTime PASCAL COleDateTime::GetCurrentTime() { return COleDateTime(::time(NULL)); } といった処理です。 つまり::time()関数を使っているようです。 ただし、::time()関数が2038年以降に対応しているというわけではないと思います。 その後、(年を取得する処理を例にとると)COleDateTime::GetYear()関数の内部で、_AfxTmFromOleDate()という関数が呼び出され、この関数の中で、いろいろと処理を施して、正確な値を取り出しているようです。 ちなみに私の開発環境は、MSVC++6.0です。

keyguy
質問者

お礼

ありがとうございます MFCは使っていないのが残念です 結局自分で日付演算をしたほうが早そうですね 4年に一回のうるう年を100で割り切れる年の内400で割り切れない年だけ無にすれば良いという簡単な条件ですから

全文を見る
すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

C言語では時刻はtime_t型で表現していますが、 64ビットモードの場合は、このtime_t型が8バイトになります。従って、2036年以降でも、64ビットモードであれば、問題なく動作します。 64ビットモードの対応は、Solarisでは対応済です。他のOSは詳細不明ですが、Linuxも64ビット版がでていると思います。(Linuxで64ビットでの使用経験はないので自信なしです)。Windowsはまだ対応していないと思いますが、まもなく対応すると思われます。(これも自信なし)

keyguy
質問者

お礼

ありがとうございます 2036年は正確に求めてみると 2038年1月19日12時14分7秒でした time_tでは256×256×256×128-1です Windowsでは対応していないようですが APIでも対応している関数は無いのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 2038年問題 日付算出

    2038年問題で困っています。 指定した日付から指定した日数後および前(マイナス日数)の日付を取得するCのプログラムがあります。 これまでmktime関数をして算出していましたが、2038年以降の日付を指定するとエラーになるようです。 上記関数をmktime関数を使用せず自前で作成しないといけないのですが、どう作っていいか思いつきません。どなたか参考になるようなサイト、およびサンプルプログラムがあれば教えていただきたいと思っています。 よろしくお願いします。

  • localtime() 関数についての質問

    C言語の勉強をして間もない者です。 time_t = current; struct tm = *local; time(&current); local = localtime(&current); こんなのがlocaltime関数を使った一般的なプログラムだと思いますが、なぜlocaltimeの引数がcurrentのポインタなのでしょうか? 別にcurrentには値を代入しないのだから、localtime(current)でもいいとおもうのですが、ポインタにした必然的理由があるのでしょうか?

  • ユニックス時間(秒)を普通の日付時間(時:分:秒)に直すにはどうすればいいでしょうか。

    こんにちわ。質問させて頂きます。 C言語で、pcap.hによってキャプチャされたパケットのタイムスタンプ(秒)を、標準時間と申しますか、時:分:秒に直したいと考えています。 時間変換の関数で、ctime,asctime,localtime等があるのは分かっているので、localtime関数を使おうと思っているのですが、使ってみたところポインタのタイプが違うのでエラーが出てしまいます。 具体的には、 方法(1):time_t変数に代入してやってみる struct tm *t_st; time_t timer; timer = header->ts; t_st = localtime (&timer); 方法(2):localtime関数に直接放り込む t_st = localtime (&header->ts); 等を試してみたのですが当然アウトでした。 パケットヘッダの中の時間を表すheader->tsをどうにかlocaltime関数で使いたいと考えています。 これを解決する良い方法はあるでしょうか。 ご存知であればご教授いただけないでしょうか。どうぞよろしくお願いします。

  • C言語で分からないところがあります。整数値の分割取得みたいなこと・・

    C言語で分からないところがあります。整数値の分割取得みたいなこと・・ で困っています。 僕はC言語初心者です。 コンパイラはVC2008です。 今回整数値を分割して取得したいと考えています。 例えば次のような整数値(int型)があったとします。 235465667 この整数値を3つにわけて取得したいのです。つまり 235 465 667 としたいのです。このような働きをしてくれる便利な関数はないのでしょうか? 調べてみたのですが、内容が内容だけに探しにくくて見つけられませんでした。 もし、関数がなければ、どのようにすれば取得できるかコードを教えてほしいです。 よろしくお願いします!

  • mktimeについて教えてください

    今、日付の差を出すプログラムを作っているのですが mktime()関数では 1970年~2038年までしか 対応していないことがわかりました mktime()以外で 日付を Unix のタイムスタンプとして取得する 関数ってありますか?

    • ベストアンサー
    • PHP
  • localtimeはどうやって現地時刻を返すか教えてください

    UNIXでCプログラミングをしています。 localtime()は「現地時刻を返す」と教わりました。 東京で実行していればJSTが、ロンドンで実行していれば GMTが返ってくる、ということですよね。 では、localtime()関数はどのようにして 「現在実行している地域」がわかるのでしょうか、また は何を判断して現地時刻を返すのか教えてください。 よろしくお願いいたします。

  • fortranで、C言語のsizeof関数に相当するものが分からない

    データ型のバイト数を調べる際、C言語ではsizeof関数が用いられますが、Fortranではどうすればよいでしょうか? 一つの関数でなくとも、そのような機能をもつルーチンでも構いません。

  • 日付の計算をmktimeの仕様にしたい

    こんにちは。下のような実行ソースプログラムを作ったのですが、 <?php   echo("2005/1/29の1ヶ月後:". date( "Ymd", mktime(0,0,0,1+1,29,2005) )."<BR>" );   echo("2005/1/30の1ヶ月後:". date( "Ymd", mktime(0,0,0,1+1,30,2005) )."<BR>" );   echo("2005/1/31の1ヶ月後:". date( "Ymd", mktime(0,0,0,1+1,31,2005) )."<BR>" ); ?> 実行結果において > 2004/1/30の1ヶ月後:20040301 > 2005/1/29の1ヶ月後:20050301 > 2005/1/30の1ヶ月後:20050302 のような不具合が出てしまいます。どう直してよいものか行き詰ってしまっているので、どなたかアドバイスを宜しくお願いします。 基本形はfunction_exという関数を作って↓ function mktime_ex(...) {   例外処理   必要に応じて return  // その他は、標準機能に任せる  return mktime( sec, min, hour, ... ); } という形にしたいと思っています。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 長方形の交わりを求める関数をください

    Win32APIにIntersectRect()という関数があります。この関数は2つの長方形が交わっているか否かを調べ、交わっているなら交差長方形を求めてくれます。この関数と同等の機能をもつC言語の関数とそのソースコードを,どなたかくださいませんか.

  • エフェクターの調子が悪いのですが。

    忙中お手数かけます。 私の愛器「DIGITECH RP-1」が Over flowのインジケータを点灯させ パッチNo.表示が 888 になったまま 機能しなくなりました。 昨日まで調子よく動いていたのですが、突然のことで 参っています。 古いものですが、愛着のあるものなので どなたか悩めるギターモンキーに原因と対策の知恵を授けてください。 よろしくお願いします。

このQ&Aのポイント
  • 結婚の話をした後、彼氏の優しさが増して連絡頻度も上がったり、細かい連絡もしてくるようになった。
  • 彼は結婚はしたいけど、まだもうちょっと付き合ってからでよくないかと言っている。
  • 彼が婚約破棄のトラウマを抱えている可能性がある。
回答を見る