Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何修复打印时间的函数,使其不会慢8小时?_C_Time - Fatal编程技术网

C 如何修复打印时间的函数,使其不会慢8小时?

C 如何修复打印时间的函数,使其不会慢8小时?,c,time,C,Time,这是对我创建的C库的测试,它可以打印一天中的小时、分钟和秒数: #include <time.h> #include <stdio.h> time_t print_time(time_t t) { if(!t) t = time(NULL); printf("%d:%.2d.%.2d\n", (t % (60*60*60))/(60*60), (t % (60*60))/60, t % 60); fflush(stdout); retur

这是对我创建的C库的测试,它可以打印一天中的小时、分钟和秒数:

#include <time.h>
#include <stdio.h>

time_t print_time(time_t t)
{
    if(!t) t = time(NULL);
    printf("%d:%.2d.%.2d\n", (t % (60*60*60))/(60*60), (t % (60*60))/60, t % 60);
    fflush(stdout);
    return t;
}

int main(void)
{
    print_time(0);
}
当我第一次运行这个程序的时候是10:56.42,但是打印时间函数打印的是2:56.42。我该如何解决这个问题

我试着从12减去t%60*60*60/60*60,然后打印出来,它打印出正确的时间,但是当时间变为11时,打印出来的时间是9。

60*60*60意味着60小时,而不是一天。你想要的是:

printf("%d:%.2d.%.2d\n", (t % (24*60*60))/(60*60), (t % (60*60))/60, t % 60);
在法国,此程序打印正确的时间减去2小时,不考虑UTC+1中添加的夏令时+1

我建议您改用标准库函数,比如localtime或gmtime

现在,信息的结构点,日期,时间,你可以说

struct tm {
   int tm_sec;         /* seconds,  range 0 to 59          */
   int tm_min;         /* minutes, range 0 to 59           */
   int tm_hour;        /* hours, range 0 to 23             */
   int tm_mday;        /* day of the month, range 1 to 31  */
   int tm_mon;         /* month, range 0 to 11             */
   int tm_year;        /* The number of years since 1900   */
   int tm_wday;        /* day of the week, range 0 to 6    */
   int tm_yday;        /* day in the year, range 0 to 365  */
   int tm_isdst;       /* daylight saving time             */   
};
您的方法、本地方法和gm方法的完整示例:

#include <time.h>
#include <stdio.h>

int main()
{
    time_t t = time(NULL);
    printf("%d:%.2d.%.2d\n", (t % (24*60*60))/(60*60), (t % (60*60))/60, t % 60);
    struct tm *tstruct = gmtime(&t);
    printf("%d:%.2d.%.2d\n",tstruct->tm_hour,tstruct->tm_min,tstruct->tm_sec);
    tstruct = localtime(&t);
    printf("%d:%.2d.%.2d\n",tstruct->tm_hour,tstruct->tm_min,tstruct->tm_sec);
}
似乎您的代码现在可以正确模拟UTC时间的小时数。现在更多的挑战与闰年和所有

如果您不能使用除时间之外的标准libs,并且您需要本地时间,那么您还必须处理时区。您必须像操作系统一样在一些自定义设置中硬编码。

60*60*60意味着60小时,而不是一天。你想要的是:

printf("%d:%.2d.%.2d\n", (t % (24*60*60))/(60*60), (t % (60*60))/60, t % 60);
在法国,此程序打印正确的时间减去2小时,不考虑UTC+1中添加的夏令时+1

我建议您改用标准库函数,比如localtime或gmtime

现在,信息的结构点,日期,时间,你可以说

struct tm {
   int tm_sec;         /* seconds,  range 0 to 59          */
   int tm_min;         /* minutes, range 0 to 59           */
   int tm_hour;        /* hours, range 0 to 23             */
   int tm_mday;        /* day of the month, range 1 to 31  */
   int tm_mon;         /* month, range 0 to 11             */
   int tm_year;        /* The number of years since 1900   */
   int tm_wday;        /* day of the week, range 0 to 6    */
   int tm_yday;        /* day in the year, range 0 to 365  */
   int tm_isdst;       /* daylight saving time             */   
};
您的方法、本地方法和gm方法的完整示例:

#include <time.h>
#include <stdio.h>

int main()
{
    time_t t = time(NULL);
    printf("%d:%.2d.%.2d\n", (t % (24*60*60))/(60*60), (t % (60*60))/60, t % 60);
    struct tm *tstruct = gmtime(&t);
    printf("%d:%.2d.%.2d\n",tstruct->tm_hour,tstruct->tm_min,tstruct->tm_sec);
    tstruct = localtime(&t);
    printf("%d:%.2d.%.2d\n",tstruct->tm_hour,tstruct->tm_min,tstruct->tm_sec);
}
似乎您的代码现在可以正确模拟UTC时间的小时数。现在更多的挑战与闰年和所有


如果您不能使用除时间之外的标准libs,并且您需要本地时间,那么您还必须处理时区。您必须像操作系统一样在某些自定义设置中硬编码。

为什么不使用标准时间函数?像mktime?60*60*60那是60小时。你是说可能是24*60*60?我指的是标准的mktime函数,它设置了一个带有日期和时间的时间结构。考虑改用localtime和strftime。由于每天使用60小时而不是24小时,所以8小时是12小时的复合时间,而您的时区是4小时。将60更正为24时,以UTC打印时间。如果要打印本地时间,或者接受更正后的代码以UTC而不是本地时间打印时间,则必须进一步调整本地时区。@JonathanLeffler我接受。我将把函数重命名为print_utc_time。为什么不使用标准时间函数呢?像mktime?60*60*60那是60小时。你是说可能是24*60*60?我指的是标准的mktime函数,它设置了一个带有日期和时间的时间结构。考虑改用localtime和strftime。由于每天使用60小时而不是24小时,所以8小时是12小时的复合时间,而您的时区是4小时。将60更正为24时,以UTC打印时间。如果要打印本地时间,或者接受更正后的代码以UTC而不是本地时间打印时间,则必须进一步调整本地时区。@JonathanLeffler我接受。我将把函数重命名为print_utc_time。