【问题标题】:Is time_t returned by time() zone specific?time_t 是否由 time() 区域特定返回?
【发布时间】:2011-11-17 14:25:40
【问题描述】:

我是<time.h> 的新手,对time_t 和time() 有疑问。

我阅读了函数 time() 记录如下:

time_t 时间(time_t * 定时器);获取当前时间

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

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

文档没有讨论时区。

因此,对于以下 C++ 代码:

time_t t = time(NULL);

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

无论时区如何,time() 都会返回一个值吗?

【问题讨论】:

    标签: c++ c time timezone


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      没有;此函数返回从 1970 年 1 月 1 日 00:00:00 UTC 开始的第二个计数。

      Wikipedia

      【讨论】:

        【解决方案3】:

        嗯,它记录了返回 time_t - 这是 documented 与:

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

        所以严格来说,从外观上看并不能保证跨平台,但实际上可以以跨平台的方式处理,并且是 UTC。

        (当然,time_t 将有多个文档来源......我不确定这里究竟可以认为什么是确定的。)

        【讨论】:

          【解决方案4】:

          time_t 值与时区差异无关,因为它们从epoch 开始计算时间。如果你想有一个本地日历时间,你可以将 time_t 值传递给 localtime() 函数,该函数返回一个指向 struct tm 的指针和你的本地时间。

          【讨论】:

            【解决方案5】:

            根据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 与 local 相比 时间,即the calendar time expressed for some specific time zone。 还有The range and precision of times representable in clock_t and time_t are implementation-defined.

            结果:

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

            【讨论】:

              【解决方案6】:

              这将为您提供“本地时代”:

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

              【讨论】:

                猜你喜欢
                • 2014-01-07
                • 1970-01-01
                • 1970-01-01
                • 2012-04-14
                • 1970-01-01
                • 2018-10-06
                • 2011-06-16
                • 2017-08-04
                • 2016-08-11
                相关资源
                最近更新 更多