2017-08-22 13 views

答えて

2

tmの内容を検査する場合は、それはあなたが期待するものでなければなりません。

get_time%aは、tm_wdayに解析されます。

しかし、mktimeは、tm_wdaytm_ydayをまったく使用せず、他のフィールドのみを使用します。実際には、mktime実際にはは、これらのフィールドをに設定します(tm入力はconstにできません)。

したがって、実際にはtm_year、多くのプラフォームではtime_tが1970年以降に秒数で表示されていますが、1970年以前は無効とみなされます。

MSVCで例えば、time_tは64ビット符号付き整数であるが、唯一のmktime is documentedがために有効である「23時59分59秒に1970年1月1日、12月31日、3000は」

+0

"Tue、15 Nov 2010 08:12:31 GMT"という日付でチェックしました。しかし、 'tm'の全てのフィールドはゼロです。 –

+0

mktimeの前に 'tm_wday'が3でなければなりません。失敗したときに' mktime'が上書きするかどうかは分かりませんが、確かに成功するでしょう。今週の真夜中に言いたい時間を得るには、適切な 'tm_year'や' tm_mon'のような他の値と組み合わせて、最初の日の 'tm_mday'を見つけ出す必要がありますその後、 'tm_mday + = tm_wday'を調整してください) –

+0

私がチェックしたとき、私は' mktime'を呼び出さなかった。 –

0

あなたの呼び出しは、おそらく、正常書きますその後mktimeを使用した場合t->tm_wdayに、まだ、time->tm_wdayの値は無視されます。

のstd :: mktime関数

... time-> tm_wdayおよびtime-> tm_ydayは無視されます。値は で、通常の範囲外にすることができます。 ...

はそのため、あなたはtmに書き込むすべてが無視され、その結果はtime_tとして表現することができず、戻り値は、このように-1です。 mktimeとは対照的に

std::put_timeは(FebruaryFebに変わるかもしれないような)それぞれの値を使用しますが、出力のためにそれらを再解釈:

int main() 
{ 
    std::tm t = {}; 
    istringstream ss("Thursday February"); 
    ss >> std::get_time(&t, "%a %b"); 
    if (ss.fail()) { 
     cout << "invalid date value." << endl; 
    } 
    else { 
     std::cout << "Date: " << std::put_time(&t, "%a %b") << endl; 
    } 
    return 0; 
} 

出力:

Date: Thu Feb 
+0

私はあなたのサンプルを実行すると、私は取得: '無効な日付の値。それは本当に奇妙です。 –

+0

しかし、ロケールを設定しなければ、それは動作します。 –

関連する問題