使用以下代码,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
答案 0 :(得分:4)
这是因为d1
和d2
在调用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描述是
说明
mktime
函数转换细分时间,表示为 当地时间,以timeptr
指向日历中的结构 时间值,其编码与返回的值相同 时间功能。tm_wday
和tm_yday
的原始值 结构的组件会被忽略,而 其他成分不限于所示范围 。)320)成功完成操作后,tm_wday
和tm_yday
结构的组成部分已适当设置,并且 其他组件设置为代表指定的日历时间,但是 其值被强制在上述范围内;决赛 在确定tm_mday
和tm_mon
之前,不会设置tm_year
的值。
(强调我的意思)
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
仅使用格式要求的细分结构的字段。