标准C中怪异的mktime行为

时间:2018-10-19 16:20:54

标签: c strptime

使用以下代码,strptime输出正确但mktime完全关闭,有人可以在这里帮助我吗?

#define _XOPEN_SOURCE 700
#include <stdio.h>
#include <time.h>

int main(void) 
{
    int ddate;
    double dt;
    char dstr1[20],dstr2[20];
    time_t s1,s2;
    struct tm d1,d2;

    strptime("04/06/2015","%m/%d/%Y",&d1); 
    strptime("08/06/2015","%m/%d/%Y",&d2);
    strftime(dstr1,20,"%Y-%m-%d",&d1);
    strftime(dstr2,20,"%Y-%m-%d",&d2); 
    printf("%s,%s\n",dstr1,dstr2);
    s1=mktime(&d1);
    s2=mktime(&d2);
    printf(ctime(&s1));
    printf(ctime(&s2));
    return(0);
}
=== output ====
2015-04-06,2015-08-06
Mon Apr  6 01:51:31 2015
Sun Jan 14 07:16:48 113900

2 个答案:

答案 0 :(得分:4)

这是因为d1d2在调用strptime之前包含垃圾,并且仅设置struct tm的年,月和日。因此,mktime正在尽力处理其他字段中的随机值。

添加对memset的调用,或使用其他方式清除这两个变量的内容,然后代码按预期工作。

#define _XOPEN_SOURCE
#include <stdio.h>
#include <time.h>
#include <string.h>
int main () 

    {
    int ddate;
    double dt;
    char dstr1[20],dstr2[20];
    time_t s1,s2;
    struct tm d1,d2;

    memset(&d1,0,sizeof(d1));
    memset(&d2,0,sizeof(d2));
    strptime("04/06/2015","%m/%d/%Y",&d1); 
    strptime("08/06/2015","%m/%d/%Y",&d2);
    strftime(dstr1,20,"%Y-%m-%d",&d1);
    strftime(dstr2,20,"%Y-%m-%d",&d2); 
    printf("%s,%s\n",dstr1,dstr2);
    s1=mktime(&d1);
    s2=mktime(&d2);
    printf("%s",ctime(&s1));
    printf("%s",ctime(&s2));
    return(0);
}

答案 1 :(得分:0)

mktime的C11描述是

  

说明

     
      
  1. mktime函数转换细分时间,表示为   当地时间,以timeptr指向日历中的结构   时间值,其编码与返回的值相同   时间功能。 tm_wdaytm_yday的原始值   结构的组件会被忽略,而   其他成分不限于所示范围   。)320)成功完成操作后,tm_wday和   tm_yday结构的组成部分已适当设置,并且   其他组件设置为代表指定的日历时间,但是   其值被强制在上述范围内;决赛   在确定tm_mdaytm_mon之前,不会设置tm_year的值。
  2.   

(强调我的意思)


d1中的垃圾是原因。我写了一个简化程序:

#define _XOPEN_SOURCE 700
#include <stdio.h>
#include <time.h>

int main(void) {
    time_t s1;
    struct tm d1;

    strptime("04/06/2015","%m/%d/%Y",&d1); 
    printf("%02d:%02d:%02d\n", d1.tm_hour, d1.tm_min, d1.tm_sec);
    s1=mktime(&d1);
    puts(ctime(&s1));
    return(0);
}

输出为(例如)

910751933:01:00
Thu May  8 05:00:01 105913

即现在是2018年10月19日星期五,时间为910751933小时1分0秒。

mktime不同,strftime仅使用格式要求的细分结构的字段。