2

strptime()日付/時刻文字列をそのコンポーネント値に解析するために使用しようとしています。テストとして、次のコードを使用して、固定の日時文字列を解析し、結果の値を出力しようとしました。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(void)
{
        struct tm tm;
        memset(&tm, 0, sizeof(struct tm));
        strptime("2001/11/12 18:31:01", "%Y/%m/%d %H:%M:%S", &tm);
        printf("year: %d; month: %d; day: %d;\n",
                        tm.tm_year, tm.tm_mon, tm.tm_mday);
        printf("hour: %d; minute: %d; second: %d\n",
                        tm.tm_hour, tm.tm_min, tm.tm_sec);
        exit(EXIT_SUCCESS);
}

私が得る出力は次のとおりです。

year: 101; month: 10; day: 12;
hour: 18; minute: 31; second: 1

他の値は問題ないように見えますが、年と月が入力と一致しません ( 2001/11/12 18:31:01)。何故ですか?

4

1 に答える 1

5

Cの astruct tmでは、年は 1900 年からの年数で、月はゼロから始まります (0 = 1 月)。

したがって、日付の出力ステートメントは次のようになります。

printf("year: %d; month: %d; day: %d;\n",
    tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);

ISO C117.25.1 Components of timeでは次のように述べられています (ただし、この動作はかなり前にさかのぼります)。

tm構造体には、少なくとも次のメンバーが任意の順序で含まれている必要があります。メンバーのセマンティクスとその通常の範囲は、コメントで表現されます。

int tm_sec;     // seconds after the minute — [0, 60]
int tm_min;     // minutes after the hour — [0, 59]
int tm_hour;    // hours since midnight — [0, 23]
int tm_mday;    // day of the month — [1, 31]
int tm_mon;     // months since January — [0, 11]
int tm_year;    // years since 1900
int tm_wday;    // days since Sunday — [0, 6]
int tm_yday;    // days since January 1 — [0, 365]
int tm_isdst;   // Daylight Saving Time flag
于 2013-11-11T13:03:18.270 に答える