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

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

我阅读了函数 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 timelocal 相比 时间,即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
                相关资源
                最近更新 更多