mktime返回-1,但我期待我的tm结构是有效的
timeStruct @0x13b123b0 tm
tm_hour 0 int
tm_isdst 0 int
tm_mday 1 int
tm_min 0 int
tm_mon 0 int
tm_sec 33 int
tm_wday 4 int
tm_yday 0 int
tm_year 70 int
这是我的结构,由QTcreators记忆手表代表。mktime返回-1,但我期待我的tm结构是有效的
与此作为参数的mktime()
struct tm *timeStruct;
//[...]
time_t timeOrigin = mktime(timeStruct);
timeOrigin
呼叫变为-1。
这里有很多问题问出来的一样。
但他们都被提示得到解决,该tm_year字段不为自1970年以来年,但年自1900年以来,我意识到这一点,也尊重它。
什么混淆我进一步为:
手册页想:http://linux.die.net/man/3/mktime
解释mktime不改变结构的成员,如果它返回-1。在我的情况下,它确实在之前的情况下调整了tm_wday
和tm_yday
,而返回-1。
我不能阅读标准错误,之后返回mktime藏汉-1
找到有关这个任何错误。
那么这里发生了什么?
mktime
返回-1,因为tm
结构值,解释为时间和日期在本地时间表示,会超出有效范围。由于从该名男子页引述:如果指定破旧的时间不能表示为日历时间(从epoch秒),mktime()
回报(time_t)-1
并不会改变破旧的时间结构的成员。
您可能位于格林威治东部,这意味着当地时间1970年1月1日0:00:00落在从1970年1月1日0:00:00开始的Unix Epoch开始之前。
mktime
预计struct tm
类型的指针,因为它是第一个参数。
下面是一个例子,你如何使用它:
#include <stdio.h>
#include <time.h>
int main(void)
{
struct tm tm = *localtime(&(time_t){time(NULL)});
printf("Today is %s", asctime(&tm));
tm.tm_mon -= 100; // tm_mon is now outside its normal range
time_t t = mktime(&tm); // recalculate tm
printf("100 months ago was %s", asctime(&tm));
}
我的时间结构是一个指针,我认为这是自我解释,因为ot herwise我不得不这样调用它:'mktime((struct tm *)timeStruct);'增加了它的澄清 – dhein
“如果指定的破旧时间不能被表示为日历时间(秒从epoch),mktime()返回(time_t的)-1和不改变破旧时间结构的成员”。但是,也许我从背景中读出它。但无论如何,我的问题在于它。 – dhein
现在我明白了:你错误地引用了它。 –
@WeatherVane:所以它属于不给我的上下文吗? (在这种情况下,我会把这些信息拿出来) – dhein