mktime返回-1,但我期待我的tm结构是有效的

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_wdaytm_yday,而返回-1。

我不能阅读标准错误,之后返回mktime藏汉-1找到有关这个任何错误。

那么这里发生了什么?

+0

“如果指定的破旧时间不能被表示为日历时间(秒从epoch),mktime()返回(time_t的)-1和不改变破旧时间结构的成员”。但是,也许我从背景中读出它。但无论如何,我的问题在于它。 – dhein

+0

现在我明白了:你错误地引用了它。 –

+0

@WeatherVane:所以它属于不给我的上下文吗? (在这种情况下,我会把这些信息拿出来) – dhein

mktime返回-1,因为tm结构值,解释为时间和日期在本地时间表示,会超出有效范围。由于从该名男子页引述:如果指定破旧的时间不能表示为日历时间(从epoch秒),mktime()回报(time_t)-1并不会改变破旧的时间结构的成员。

您可能位于格林威治东部,这意味着当地时间1970年1月1日0:00:00落在从1970年1月1日0:00:00开始的Unix Epoch开始之前。

+0

isdst标志为零,所以对于mktime这应该很重要,如果我理解它是正确的,所以在这个方向isn'这是否重要,是吗? – dhein

+0

'isdst'(如果设置)*以及*本地时间调整。 –

+0

@Zaibis:'mdtime'作为额外的信息来区分常规时间和夏令时,它可以在许多时区和地点选择使用。实际上,在秋季切换回正常时间时,需要准确指出UTC时间模糊的1小时重叠。没有将UTC分解时间转换为unix时间值的标准功能。 – chqrlie

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)); 
} 
+0

我的时间结构是一个指针,我认为这是自我解释,因为ot herwise我不得不这样调用它:'mktime((struct tm *)timeStruct);'增加了它的澄清 – dhein