アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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 …

下記のサイトも参考になります。

188707 - INFO年オーバーフローがVisual C++と2000年問題をそれによって発生します。
http://support.microsoft.com/default.aspx?scid=k …

KATA World ぷろぐらむ アーカイブ
http://katakuri.sakura.ne.jp/~kata/archives/cat5 …

現在、特効薬がないか、調査中です。
    • good
    • 0
この回答へのお礼

ありがとうございます

#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(無償版)を使っていますがこれがいけないのかもしれません

お礼日時:2004/08/20 03:24

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です。
    • good
    • 0
この回答へのお礼

ありがとうございます

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

お礼日時:2004/08/19 19:29

C言語では時刻はtime_t型で表現していますが、


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

ありがとうございます

2036年は正確に求めてみると
2038年1月19日12時14分7秒でした
time_tでは256×256×256×128-1です

Windowsでは対応していないようですが
APIでも対応している関数は無いのでしょうか?

お礼日時:2004/08/19 16:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!