7

年、ユリウス日 (年日)、時、分、観測値を含む 2 つの文字列を読み取ります。

sscanf を使用して関連する変数を取り出します。

sscanf(tide_str1.c_str(), "%d %d %d %d %Lf", &y1, &j1, &h1, &m1, &obs1);
sscanf(tide_str2.c_str(), "%d %d %d %d %Lf", &y2, &j2, &h2, &m2, &obs2);

この特定のデータ セットの場合、値は 2011 083 23 22 1.1 です。

次に、tm 構造体を作成して入力し、mktime を実行します。その間にその日の cout 呼び出しを行うと、083 から 364 に変わります。

int y1=2011, j1=83, h1=23, m1=22;
struct tm time_struct = {0, 0, 0, 0, 0, 0, 0, 0, 0}, *time_ptr = &time_struct;
time_t tv_min;
time_struct.tm_year = y1 - 1900;
time_struct.tm_yday = j1;
cout << time_struct.tm_yday << endl;
time_struct.tm_hour = h1;
time_struct.tm_min = m1;
time_struct.tm_isdst = -1;
cout << time_struct.tm_yday << endl;
tv_min = mktime(time_ptr);
cout << time_struct.tm_yday << endl;

何故ですか?tm_mday と tm_mon が 0 に設定されているためでしょうか。最初はすべてをゼロに初期化しないようにしましたが、mktime は -1 を返しました。月と月の日がわからず年日しかわからない場合、どうすればよいでしょうか?

4

1 に答える 1

20

mktime()やるべきことをやっている。

C標準を引用:

mktime関数は、 timeptrが指す構造体のローカル時間として表される分解された時間を、 time関数によって返される値と同じエンコーディングを使用してカレンダー時間値に変換します。構造体のtm_wdayおよび tm_ydayコンポーネントの元の値は無視され、他のコンポーネントの元の値は上記の範囲に制限されません。正常に完了すると、 tm_wdaytm_ydayの値 構造体のコンポーネントは適切に設定され、他のコンポーネントは指定されたカレンダー時間を表すように設定されますが、それらの値は上記の範囲に強制されます。tm_montm_yearが決定されるまで、 tm_mdayの最終値は設定されません。

mktime()他のメンバーの値と他のメンバーからの値を計算できます。これらのフィールドから他のメンバーの値を計算するようには設計されていません。tm_mdaytm_yday

ただし、できることは、struct tm範囲外の値で a を初期化することです。たとえば、200 (年の 200 日) になりたい場合は、1 月の 200 日を表す tm_ydayを初期化できます。次に、それを正しい日付に正規化し、またはにフィードできる値を生成します。struct tmmktime()time_tgmtime()localtime()

簡単な例を次に示します。

#include <iostream>
#include <ctime>

int main()
{
    struct tm t = { 0 };
    t.tm_sec = t.tm_min = t.tm_hour = 0; // midnight
    t.tm_mon = 0;                        // January
    t.tm_year = 2012 - 1900;
    t.tm_isdst = -1;                     // unknown

    t.tm_mday = 200;                     // January 200th?

    time_t when = mktime(&t);
    const struct tm *norm = localtime(&when);   // Normalized time

    std::cout << "month=" << norm->tm_mon << ", day=" << norm->tm_mday << "\n";
    std::cout << "The 200th day of 2012 starts " << asctime(norm);
}

出力は次のとおりです。

month=6, day=18
The 200th day of 2012 starts Wed Jul 18 00:00:00 2012
于 2012-03-05T22:47:33.393 に答える