簡體   English   中英

mktime不更新struct tm

[英]mktime does not update the struct tm

我正在使用VS2010,此代碼被編譯為ANSI C項目

int C90Clockadapter_GetCW_ISO8601(const C90Clockadapter * clockadapter, int * calendarweek)
{
    int e = 0;
    struct tm tm;
    char timebuf[64];

    memset( &tm, 0, sizeof( tm ) );
    tm.tm_mday = clockadapter->mDay;
    tm.tm_mon = clockadapter->mMonth;
    tm.tm_year = clockadapter->mYear;

    mktime(&tm);  

    if (0 != strftime(timebuf,sizeof(timebuf),"%W", &tm) ) //i know %W is not ISO8601
    {
        *calendarweek = atoi(timebuf);
    }
    else
    {
        e |= 1;
    }

    return e;
}

不知何故mktime(&tm)不會更改tm的狀態。 這種行為完全不符合我的預期。

我編寫了一些具有自我解釋輸出的單元測試:

4.1.1971 - expected CW 1 but was CW 0
31.12.1992 - expected CW 53 but was CW 0

我的代碼有什么問題-還是Windows或我缺少的vs2010和ansi-c有一些特殊功能?

參考文獻指出,它不一定會修改timeptr參數。 您應該使用返回值。 參見http://www.cplusplus.com/reference/ctime/mktime/

time_t mktime (struct tm * timeptr);

時間格式無效。 mktime返回-1,並且未處理。

此代碼段顯示了如何正確填充struct tm

tm.tm_mday = clockadapter->mDay;
tm.tm_mon = clockadapter->mMonth - 1;
tm.tm_year = clockadapter->mYear - 1900;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM