[英]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.