mktime()函数的奇怪现象

jackydi jackydi 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
今天把程序从centos6.5移植到centos7.5下,发现一个奇怪的问题,经排查,发现和mktime()函数有关,测试代码如下:


#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
#include <stdint.h>

#define STR_TO_INT(x) strtoul(x, 0, 10)

int check_time(char **str1, uint64_t *ret)
{
int len, i;
char *p, p1[5];
time_t tmt;
struct tm t;
char *str = *str1;
char tmp[15];

if (str == NULL)
{
*ret = 0;
return 0;
}

len = strlen(str);
if (len > 14) /* YYYYMMDDhhmmss */
{
str[14] = 0;
len = strlen(str);
}

for (i=0; i<len; i++)
{
if ((str[i] < '0') || (str[i] > '9'))
return -1;
}

strncpy(tmp, str, 14);
for (i=len; i<14; i++)
{
tmp[i]='0';
}
tmp[14] = '\0';

p = tmp;
memcpy(p1, p, 4);
p1[4]=0;
p += 4;
t.tm_year = STR_TO_INT(p1);
if (t.tm_year<=1900)
t.tm_year = 1900;
t.tm_year -= 1900;

memcpy(p1, p, 2);
p1[2]=0;
p += 2;
t.tm_mon = STR_TO_INT(p1);
if (t.tm_mon == 0)
t.tm_mon = 1;
else if (t.tm_mon > 12)
return -1;
t.tm_mon -= 1;

memcpy(p1, p, 2);
p1[2]=0;
p += 2;
t.tm_mday = STR_TO_INT(p1);
if (t.tm_mday == 0)
t.tm_mday = 1;
else if (t.tm_mday > 31)
return -1;

memcpy(p1, p, 2);
p1[2]=0;
p += 2;
t.tm_hour = STR_TO_INT(p1);
if (t.tm_hour>23)
return -1;

memcpy(p1, p, 2);
p1[2]=0;
p += 2;
t.tm_min = STR_TO_INT(p1);
if (t.tm_min>59)
return -1;

memcpy(p1, p, 2);
p1[2]=0;
p += 2;
t.tm_sec = STR_TO_INT(p1);
if (t.tm_sec>59)
return -1;

t.tm_isdst = 0;

printf("%d\n",t.tm_isdst);

printf("%d-%d-%d %d:%d:%d\n",t.tm_year, t.tm_mon, t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec);

tmt = mktime(&t);
printf("%llu\n", tmt);

localtime_r(&tmt, &t);

printf("%d-%d-%d %d:%d:%d\n",t.tm_year, t.tm_mon, t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec);
*ret = tmt*1000;
return 0;
}

int main(int argc, char ** argv)
{
uint64_t t;

check_time(&argv[1], &t);
printf("t=%llu\n", t);
return 0;
}


这段代码在centos6.5上没有问题,在centos7.5上打印输出就不一样,不知道怎么回事?

在centos 6.5上测试如下:

[root@sslever test]# gcc -o t tt.c
[root@sslever test]# ./t 201904191025
0
119-3-19 10:25:0
1555640700
119-3-19 10:25:0
t=1555640700000

[root@sslever test]#


在centos 7.5 下测试如下:

[root@centos7-1804 test]# ./t 201904191025
0
119-3-19 10:25:0
1555687500
119-3-19 11:25:0
t=1555687500000

[root@centos7-1804 test]#

同样的输入参数,在centos 6.5上转换时间就是正常的,也能正确转换回来,在centos 7.5上就不对,使用mktime()函数之后转换就是错的,不知道怎么回事?
...全文

相关推荐

产教融合实训基地与实践中心建设逻辑图-可编辑版

产教融合实训基地与实践中心建设逻辑图-可编辑版

龙猫与奥特曼

idea2025-free.zip

idea2025-free.zip

qq_45190508

sop基于灵敏度分析的有源配电网智能软开关优化配置升级1(Matlab代码实现)

内容概要:本文提出了一种基于灵敏度分析的有源配电网智能软开关(SOP)优化配置方法,旨在应对高比例分布式电源接入带来的电压波动与网络损耗加剧等问题。研究以IEEE33节点系统为算例,通过改进的灵敏度分析模型量化各节点对电压和功率流动的影响程度,进而构建SOP选址与定容的优化模型,实现降低网损、改善电压分布及提升系统运行灵活性的目标。全文详细阐述了灵敏度指标的数学推导、目标函数与约束条件的建模过程,并基于Matlab实现了完整的仿真求解流程,具备良好的工程实用性与学术参考价值。; 适合人群:电力系统及其自动化、电气工程等相关专业的硕士博士研究生、科研机构研究人员,以及从事智能配电网规划、运行与优化的工程技术人员。; 使用场景及目标:①研究分布式电源大规模接入背景下配电网的主动调控与优化策略;②指导智能软开关在实际配电网中的科学选址与容量配置;③为相关科研课题提供可复现的仿真案例,支撑学术论文撰写与算法验证。; 阅读建议:建议读者结合提供的Matlab代码与IEEE33节点标准模型进行动手实践,重点理解灵敏度指标的物理意义及其在优化模型中的应用逻辑,关注求解过程中的约束设置与算法收敛性,并可进一步拓展至SOP与储能联合配置、多时间尺度优化等复杂场景进行二次开发与研究。

荔枝科研社

Ubuntu安装Latex

关于Ubuntu安装Latex的详细记录和排错指南

Leers Ting

高校技术转移办公室人员在成果转化过程中,如何实现科技成果与产业需求的高效对接?.docx

高校技术转移办公室人员在成果转化过程中,如何实现科技成果与产业需求的高效对接?

BIZKEEN
评论 3
收藏 已收藏
分享
返回顶部
jackydi
C语言 70,039 成员 243,237 内容