mktimeで扱える日時の範囲

[戻る]
たろう 2003/02/20(木) 19:37:36
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

アイススケーター 2003/02/20(木) 19:53:12
日本の時差が9時間あるからでは・・・

たろう 2003/02/20(木) 20:01:12
>どの時間帯についても、
>西暦 1970 年 1 月 1 日 0 時から 

という記述を時差を考慮して
西暦 1970 年 1 月 1 日 0 時から
と解釈したのですが、
私の解釈は間違ってますか?

たろう 2003/02/20(木) 21:26:04
テスト用にコンソールアプリで

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では環境変数の扱いに
違いがあるのでしょうか?

渋木宏明(ひどり) [E-Mail] [HomePage] 2003/02/20(木) 23:37:44
_tzset() してないからでは?

たろう 2003/02/20(木) 23:46:13
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でした

アイススケーター 2003/02/21(金) 07:59:59
コンピュータ内部の時計は万国標準時 (UTC)でローカル時刻と誤差があるからなんじゃないん
ですか

古いスレッドには追加発言できません。