time_t由time()返回,特定于时区

Is time_t returned by time() zone specific?

本文关键字:time 于时区 返回      更新时间:2023-10-16

我刚接触<time.h>,对time_ttime()有一个问题。

我读取函数time()文档如下:

time_t time (time_t * timer);获取当前时间

获取当前日历时间作为time_t对象。

函数返回这个值,如果参数不为空指针,该值也设置为定时器所指向的对象。

文档没有讨论时区。

因此,对于下面的c++代码:

time_t = time(NULL);

如果两台机器,一台在美国,另一台在英国,同时执行函数调用time(NULL),返回的time_t对象是否相同?

time()会返回一个值而不管时区吗?

不,它不是特定于区域的。它返回一个值,该值是自UTC时间1970年1月1日以来的秒数,忽略闰秒。所以(原则上)如果两台机器在完全相同的时间执行调用,返回的值将是相同的,即使它们在两个不同的时区工作。

好吧,它的文档返回一个time_t -它的文档是:

它几乎被普遍认为是一个整数值,表示从UTC时间1970年1月1日00:00开始经过的秒数。这是由于历史原因,因为它对应于unix时间戳,但在所有平台的C库中广泛实现。

所以严格来说,从它的外观上看,它不能保证是跨平台的,但在实践中可以被以跨平台的方式对待,并且是在UTC中。

(当然,time_t将有多个文档来源开始…

time_t值与时区差异无关,因为它们从epoch计算时间。如果您想要一个本地日历时间,您可以获取time_t值并将其传递给localtime()函数,该函数将返回一个指向struct tm的指针,其中包含您的本地时间。

不;此函数返回UTC时间1970年1月1日00:00:00开始的第二个计数。

维基百科

根据2011年发布的C语言最新标准:

1. The *time* function determines the current **calendar time**. 
2. The encoding of the value is unspecified.
3. The *time* function returns the implementation’s best approximation 
to the current calendar time.

其中日历时间按标准represents the current date (according to the Gregorian calendar) and time计算,而按本地计算time,即the calendar time expressed for some specific time zoneThe range and precision of times representable in clock_t and time_t are implementation-defined.

结果:

    time()从C库返回的
  1. time_t值必须不是特定于时区的。如果不是,则说明C库的实现不符合标准,这种情况可以认为是库中的bug。
  2. time_t值编码未指定!它可以在POSIX标准中指定,但绝对不能在C标准中指定。因此,你不能依赖于它的实现细节的假设,比如它以一秒的分辨率计算时间,或者它是一个整数,包含从1970年1月1日00:00 UTC开始经过的秒数。使用C标准库中的适当函数,例如gmtime()localtime(),将time_t转换为struct tm并访问时间戳细节。至少如果您的应用程序不被认为只受*NIX系统的限制。

这将给你一个"本地纪元":

time_t t = time(NULL);      
t = timegm(localtime(&t);