gpt4 book ai didi

c++ - mktime() 的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-03 10:36:56 25 4
gpt4 key购买 nike

继续 my attempt to create a DateTime class ,我试图在我的函数中存储“纪元”时间:

void DateTime::processComponents(int month, int day, int year, 
int hour, int minute, int second) {
struct tm time;
time.tm_hour = hour;
time.tm_min = minute;
time.tm_sec = second;
time.tm_mday = day;
time.tm_mon = month;
time.tm_year = year - 1900;
ticks_ = mktime(&time);

processTm(time);
}

void DateTime::processTm(struct tm time) {
second_ = time.tm_sec;
minute_ = time.tm_min;
hour_ = time.tm_hour;
weekday_ = time.tm_wday;
monthday_ = time.tm_mday;
yearday_ = time.tm_yday;
month_ = time.tm_mon;
year_ = time.tm_year + 1900;
}

对于任意日期,processComponents(5,5,1990,1,23,45)(1990 年 6 月 6 日凌晨 1:23:45),它按预期正确设置了所有值.

然而,经过进一步测试,我发现对于 processComponents(0,0,1970,0,0,0)(1970 年 1 月 1 日,上午 12:00:00),mktime(&time) 导致 time 被搞砸了:

time.tm_mon  = 11;
time.tm_mday = 30;
time.tm_year = 69;
time.tm_hour = 23;
time.tm_min = 0;
time.tm_sec = 0;

time.tm_isdst = 0;
time.tm_gmtoff = -18000;
time.tm_zone = "EST";
time.tm_wday = 2;
time.tm_yday = 363;

转换为 1969 年 12 月 31 日晚上 11:00:00 的日期。

我可以验证 mktime() 是负责的,因为通过注释掉该行,它会正确地报告日期和时间为 1970 年 1 月 1 日凌晨 12:00:00。

为什么 mktime() 只会弄乱纪元?我应该如何解决/解决这个问题?

谢谢!

最佳答案

您将 0 作为 day 参数传递并将其放入 time.tm_mdaystruct tm 的那个组件(并且只有那个组件)是基于 1 的,而不是基于 0 的。

别问我为什么

要指定 1970 年 1 月 1 日,12:00:00am,您需要这样调用它:

processComponents(0,1,1970,0,0,0);

作为sdtom mentioned ,您需要确保 tm_isdst 设置正确 - 0 表示无效,正数表示有效,负数表示您不知道(在这种情况下 mktime() 应该尝试猜测)。

只是想让你知道,当我将你拥有的日期 (0 Jan 1970, 00:00:00) 传递给 MSVC 9 中的 mktime() 时,它会返回一个错误(传入的 struct tm 未被修改,返回的 time_t 值为 -1)。

关于c++ - mktime() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1695389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com