mktimeに1970/01/01 00:00:00を渡すと戻り値が-1で
time_tへの変換が失敗します。
いろいろ調べたところ
mktimeに渡せる日付の最小値は1970/01/01 09:00:00のようです。
MSDNには
どの時間帯についても、
西暦 1970 年 1 月 1 日 0 時から
2038 年 1 月 18 日 19 時 14 分 07 秒までの
時刻を扱えます。
と記載されてるのですが、
なぜ1970/01/01 00:00:00を渡すと失敗するのでしょうか?
よろしくご教授ください。
環境WinMe, VC++6.0SP5
日本の時差が9時間あるからでは・・・
>どの時間帯についても、
>西暦 1970 年 1 月 1 日 0 時から
という記述を時差を考慮して
西暦 1970 年 1 月 1 日 0 時から
と解釈したのですが、
私の解釈は間違ってますか?
テスト用にコンソールアプリで
void main()
{
_putenv(TZ=JST+9);
struct tm tm;
tm.tm_year = 70;
tm.tm_mon = 0;
tm.tm_mday = 1;
tm.tm_hour = 0;
tm.tm_min = 0;
tm.tm_sec = 0;
tm.tm_isdst = 0;
time_t t = mktime(&tm);
}
とコーディングして実行してみたところ
mktimeの戻り値は-1にはなりませんでした。
同様にMFCでもC***AppのInitInstance内で
_putenv(TZ=JST+9);
CTime t(1970, 1, 1, 0, 0, 0);
としてみたらCTimeのコンストラクタ内の
mktimeの戻り値が-1になりました。
_putenvの戻り値が0であることと
念のためgetenv(TZ)の戻り値がJST+9
であることはデバッガ上で確認しました。
コンソールアプリとMFCでは環境変数の扱いに
違いがあるのでしょうか?
_tzset() してないからでは?
TZ=JST+9はTZ=JST-9の間違いですね。
・・・で
InitInstance内で
setlocale( LC_ALL, Japanese );
_putenv(TZ=JST-9);
_tzset();
CTime t(1970, 1, 1, 0, 0, 0);
としてもmktimeの戻り値が-1になります。
ちなみにコンソールアプリで
setlocale( LC_ALL, Japanese );
_putenv(TZ=JST-9);
_tzset();
time_t t = 0;
ctime(&t);
としてみたところctimeの戻り値は1970/01/01 09:00:00でした
コンピュータ内部の時計は万国標準時 (UTC)でローカル時刻と誤差があるからなんじゃないん
ですか