c时间函数返回奇怪的值

时间:2019-01-02 19:31:23

标签: c time localtime

我正在用C语言编写代码,它使用以下命令从服务器获取时间:

(这是一个非常简短的版本,代码的其他部分和函数使用time,ftime和localtime函数来获取时间)。

struct  tm *stiempo;
long    ltiempo;
FILE * arch2;

int main()
{
  print_error_time();
}


void print_error_time()
{
   time (&ltiempo);
   stiempo = localtime (&ltiempo);
   fprintf (arch2, "%02.2ld/%02.2ld/%02.2ld, \t %02.2ld:%02.2ld:%02.2ld", stiempo->tm_mday, (stiempo->tm_mon + 1), (stiempo->tm_year + 1900), stiempo->tm_hour, stiempo->tm_min, stiempo->tm_sec);
}

有时它工作得很好,但是有时候,当时间打印到文件中时,我得到的是这样的:

   21/08/2018,   15:48:7956003943165722682
   21/08/2018,   15:50:7956003943165722667
   21/08/2018,   15:51:7956003943165722649

有人知道是什么原因导致这种行为,或者是什么影响了使它们返回这些值的时间函数?

1 个答案:

答案 0 :(得分:3)

来自localtime

Broken-down time is stored in the structure tm which is defined in <time.h> as follows:

struct tm {
    int tm_sec;         /* seconds */
    int tm_min;         /* minutes */
    int tm_hour;        /* hours */
    int tm_mday;        /* day of the month */
    int tm_mon;         /* month */
    int tm_year;        /* year */
    int tm_wday;        /* day of the week */
    int tm_yday;        /* day in the year */
    int tm_isdst;       /* daylight saving time */
};

所有tm结构成员的类型均为int,并且您在%ld中为其使用了格式说明符fprintf()。相反,您应该使用%d格式说明符。

来自C标准#7.21.6.1p9

  

9如果转换规范无效,则行为是不确定的。282)如果任何参数不是对应转换规范的正确类型,则行为是不确定的。