2

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 会给出错误的输出吗?!

4

3 回答 3

4

一个time_t值总是 [1] 表示自纪元以来的秒数,即 1970-01-01 00:00:00 UTC - 加上或减去确认我们可能忽略闰秒所需的任何挥手。所以(time_t)86400代表一个单一的时刻,无论您当前的时区如何。

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

Thu Jan  1 16:00:00 1970

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

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

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

Fri Jan  2 00:00:00 1970

时代总是历史上的同一时刻,但可以用不同的方式表达。例如(使用 GNU Coreutilsdate命令,显示纪元本身,而不是像您的程序那样显示纪元后 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 函数都将它们视为自纪元以来的秒数。

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

于 2013-02-09T01:32:10.693 回答
1

秒数应为 UTC - 自 1970 年 1 月 1 日 00:00 小时以来经过的秒数 UTC

查看 time_t 的描述:

http://www.cplusplus.com/reference/ctime/time_t/

于 2013-02-08T22:30:28.567 回答
1

您参考的手册页说

ctime()、gmtime() 和 localtime() 函数都采用数据类型 time_t 的参数,它表示日历时间。当解释为绝对时间值时,它表示自 Epoch 1970-01-01 00:00:00 +0000 (UTC) 以来经过的秒数。

是一些 ctime 实现

char *
ctime(timep)
const time_t * const    timep;
{
    return asctime(localtime(timep));
}

如您所见,它使用本地时间,即相对于当前进程的时区的时间。

于 2013-02-08T22:43:21.337 回答