一个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。如果我设置$TZ
为UTC
or ""
,您的程序的输出是:
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格式。