gpt4 book ai didi

ctime 给出不正确的输出

转载 作者:太空狗 更新时间:2023-10-29 11:33:27 27 4
gpt4 key购买 nike

ctime()函数应该给出自 Epoch 以来传入的秒数的字符串格式时间。这是我的代码:

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

int main(int argc, int **argv)
{
time_t tmp=86400; // Seconds for one day
char *s;
s = ctime(&tmp);
if(!s) perror("ctime");
else printf("%s", s);
return 0;
}

该程序在我的 Ubuntu 12.04、32 位机器上给出了正确的输出:

Fri Jan  2 01:00:00 1970

但是相同的代码在我的 Scientific Linux 64 位机器上给出了错误的输出:

Thu Jan  1 16:00:00 1970

显然,根据这台机器Epoch是:

Wed Dec 31 16:00:00 1969

知道为什么 Scientific Linux 6 会给出错误的输出吗?!

最佳答案

time_t 值始终 [1] 表示自纪元以来的秒数,即 1970-01-01 00:00:00 UTC -- 加上或减去确认所需的任何手势我们可能忽略了闰秒。所以 (time_t)86400 代表一个时间点,与您当前所在的时区无关。

ctime() 函数返回一个指针,该指针指向以本地 时间表示的格式不正确的 [2] 字符串。我在 UTC 以西 8 小时,所以在我的系统上你的程序输出是:

Thu Jan  1 16:00:00 1970

(纪元加上您的 86400 的 24 小时,我的时区减去 8 小时)。

可以通过多种方式中的任何一种来确定系统对当前时区的想法。在我的 Ubuntu 系统上,/etc/timezone 包含行 America/Los_Angeles。在CentOS上,应该类似于Scientific Linux,/etc/localtime是一个二进制时区数据文件。

在这两个系统上,可以通过设置 $TZ 环境变量来覆盖系统默认时区,使用 UTC 或表示 UTC 的空字符串。如果我将 $TZ 设置为 UTC"",您的程序输出为:

Fri Jan  2 00:00:00 1970

时代总是历史上的同一时刻,但可以有不同的表达方式。例如(使用 GNU Coreutils date 命令,显示纪元本身,而不是像您的程序那样显示纪元之后的 24 小时):

$ date -d @0
Wed Dec 31 16:00:00 PST 1969
$ date -u -d @0
Thu Jan 1 00:00:00 UTC 1970
$ TZ=UTC date -d @0
Thu Jan 1 00:00:00 UTC 1970
$ TZ= date -d @0
Thu Jan 1 00:00:00 UTC 1970
$

请注意,如果您在英国,您的本地时间仅在一年中的部分时间与 UTC 匹配。

[1] 好吧,几乎总是如此。 POSIX 保证 time_t 值表示自纪元以来的秒数,但 C 标准仅说明它是一种能够表示时间的算术类型。您可以在 time_t 对象中存储您喜欢的任何值,并根据您的喜好使用它,但是所有处理 time_t 值的标准 C 和 POSIX 函数都会处理它们自纪元以来的秒数。

[2] 由于历史原因,ctime()asctime() 生成的格式相当笨拙。它的形式是 Sun Sep 16 01:03:52 1973\n\0。注意缺少任何时区信息;尾随的 '\n' 也可能令人困惑(因此我在日志文件中看到了无关的空行)。 strftime()功能给你更多的灵 active 。我建议使用 ISO 8601尽可能格式化。

关于ctime 给出不正确的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14782384/

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