コンテンツにスキップ

Top

C 言語 の mktime が時々エラーを返却する

なんか知らんが以下のソースで時々時間が変になる。

原因がわからず悩んだが、結局のところ初期化してなかっただけ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <time.h>

int main()
{
    time_t now = time(NULL); // 現在時刻

    struct tm _tm;
    _tm.tm_year = 122; // 西暦から1900引いた値なので2022年は122っj
    _tm.tm_mon  = 2;   // 月だが0始まり。3月は2
    _tm.tm_mday = 10;
    _tm.tm_hour = 0;
    _tm.tm_min  = 0;
    _tm.tm_sec  = 0;
    time_t t = mktime(&_tm);

    printf("%ld\n", t);

    return 0;
}

で、これだと時々-1になる(エラーになる)ので、memsetで初期化した。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <time.h>

int main()
{
    time_t now = time(NULL); // 現在時刻

    struct tm _tm;

    memset(&_tm, 0x00, sizeof(struct tm)); // ★初期化!

    _tm.tm_year = 122; // 西暦から1900引いた値なので2022年は122っj
    _tm.tm_mon  = 2;   // 月だが0始まり。3月は2
    _tm.tm_mday = 10;
    _tm.tm_hour = 0;
    _tm.tm_min  = 0;
    _tm.tm_sec  = 0;
    time_t t = mktime(&_tm);

    printf("%ld\n", t);

    return 0;

らばっちり!もう起きない!

構造体のなかの設定してない変数、tm_ydayやらtm_isdstにクソみたいな値が入っていて結果NGになったんだろう。

初期化大事!

以上!