【问题标题】:Is Python's time.time() timezone specific?Python 的 time.time() 时区是特定的吗?
【发布时间】:2012-08-04 11:00:03
【问题描述】:

很抱歉提出了太基本的问题,但我在阅读文档后无法将其清除。似乎我在这里遗漏或误解了一些太基本的东西。

从不同的时区调用time.time() 会同时产生不同的结果吗?这可能归结为epoch 的定义,在文档中(以及我在互联网上不那么深入的搜索中)没有提及时区。

另外,假设 time.time() 已经从不同时区的地方调用,并在他们的机器上转换为 UTC datetimes,他们都会给出相同的 UTC 时间吗?

【问题讨论】:

  • +1 考虑到错误答案的数量,这是一个很好的问题 :-)
  • 因此考虑到闰秒和精度两者都是可配置/系统相关的,来自不同时区的机器的 time() 调用可能不一样。但是对于大多数系统来说,它是相同的。我的结论对吗?
  • 而且几乎所有的答案(atm)都部分回答了我的问题,我会选择一个更完整的。

标签: python datetime time timezone


【解决方案1】:

是的,time.time() 返回自未指定 epoch 以来的秒数。请注意,在大多数系统上,这包括闰秒,尽管它是possible to configure your system clock to include them。在 cpython 上,time.time 被实现为对 C 函数 time 的调用,根据 C standard 的第 27.23.2.4.2 节,它不必使用指定的纪元:

time 函数确定当前日历时间。该值的编码是 未指定。

在几乎所有操作系统(包括 Linux、Mac OSX、Windows 和所有其他 Unix)上,纪元都是 1970-1-1, 00:00 UTC,而在这些系统上,time.time时区无关。 p>

【讨论】:

  • time() 返回“time() 将时间返回为自纪元 1970-01-01 00:00:00 +0000 (UTC) 以来的秒数。”根据 time(2) 手册页。
  • @AaronDigulla 哦,你完全正确。固定的。请注意,time(2) 理论上是特定于操作系统的。
  • 所有基于 Unix 的系统都一样,因此只有 Windows 和 MacOS
  • @AaronDigulla 事实证明 time.time 在 Windows 上也使用相同的时代。只有一小部分系统实际上将时间作为自纪元以来的秒数返回 - 大多数系统都忽略了闰秒。来自time(2)This value is not the same as the actual number of seconds between the time and the Epoch (...)
【解决方案2】:

返回值应该相同,因为它是以秒为单位的 UNIX Epoch 偏移量。

话虽如此,如果您将其转换为使用不同时区的日期,那么值当然会有所不同。

如果您从这些日期中将每个日期转换为 UTC,则结果必须相同。

【讨论】:

    【解决方案3】:

    time.time() 返回自 UNIX 纪元于 1970 年 1 月 1 日 0:00 UTC 开始以来的秒数。假设机器的时钟设置正确,它在每台机器上返回相同的值。

    【讨论】:

    • gmtime() 适用于 struct_timetime() 适用于秒。并且文档说gmtime()gmtime(time()) 相同
    • 是的,gmtime 将秒数转换为相应的 UTC struct_time。不确定这与问题有什么关系。
    • +1。 “假设机器的时钟设置正确……”
    【解决方案4】:

    根据documentation

    以浮点数的形式返回自纪元以来的时间。 请注意,即使时间总是作为浮点数返回 数字,并非所有系统都提供比 1 更精确的时间 第二。虽然此函数通常返回非递减值,但它 如果 系统时钟 有 在两次通话之间被推迟。

    维基百科说“Unix epoch”:

    Unix 纪元是 1970 年 1 月 1 日 00:00:00 UTC 时间(或 1970-01-01T00:00:00Z ISO 8601)。

    然后继续

    这个定义有一个问题,因为 UTC 直到 1972 年才以其当前​​形式存在;这个问题将在下文讨论。为简洁起见,本节的其余部分使用 ISO 8601 日期格式,其中 Unix 纪元为 1970-01-01T00:00:00Z。

    时间和日期很有趣。

    鲜为人知的事实:1894 年之前的瑞士时区是 34:08(34 分 8 秒)。 1894 年 6 月后,更新为 29:44。 (link)

    【讨论】:

    • @AaronDigulla:您的编辑为这个答案增加了很多,它不再是 RobB 的。如果我是作者,我不会欣赏如此广泛的编辑。最好写一个长评论或单独的答案。
    【解决方案5】:

    来自文档:

    该模块中定义的大部分函数都调用同名的平台 C 库函数。有时查阅平台文档可能会有所帮助,因为这些函数的语义因平台而异。

    http://docs.python.org/library/time.html?highlight=time.time#module-time

    所以答案是:视情况而定。

    【讨论】:

    • 这取决于 C 的 time(),它说:“time() 以自 Epoch 1970-01-01 00:00:00 +0000 ( UTC)。”
    【解决方案6】:

    time.time() 在同时运行time.time() 的任何机器上返回相同的值,即使这些机器使用不同的时区。

    我有两台机器,一台使用UTC,另一台使用UTC+7。

    我几乎同时在两台机器上运行这个脚本(UTC 大约提前三秒):

    import time
    from datetime import datetime
    import pytz
    
    print("GENERATING TIMESTAMP:")
    print("                                           time.time()", int(time.time()))
    print("                            datetime.now().timestamp()", int(datetime.now().timestamp()))
    print("datetime.utcnow().replace(tzinfo=pytz.UTC).timestamp()", int(datetime.utcnow().replace(tzinfo=pytz.UTC).timestamp()))
    print("                         datetime.utcnow().timestamp()", int(datetime.utcnow().timestamp()))
    
    ts = datetime.utcnow().replace(tzinfo=pytz.UTC).timestamp()
    
    print("\nGENERATING DATETIME FROM TIMESTAMP ts =", ts)
    print("                         datetime.fromtimestamp(ts)", datetime.fromtimestamp(ts))
    print("            datetime.fromtimestamp(ts, tz=pytz.UTC)", datetime.fromtimestamp(ts, tz=pytz.UTC))
    print("datetime.fromtimestamp(ts).replace(tzinfo=pytz.UTC)", datetime.fromtimestamp(ts).replace(tzinfo=pytz.UTC))
    

    UTC 机器打印了这个:

    GENERATING TIMESTAMP:
                                               time.time() 1601469475
                                datetime.now().timestamp() 1601469475
    datetime.utcnow().replace(tzinfo=pytz.UTC).timestamp() 1601469475
                             datetime.utcnow().timestamp() 1601469475
    
    GENERATING DATETIME FROM TIMESTAMP ts = 1601469475.713351
                             datetime.fromtimestamp(ts) 2020-09-30 12:37:55.713351
                datetime.fromtimestamp(ts, tz=pytz.UTC) 2020-09-30 12:37:55.713351+00:00
    datetime.fromtimestamp(ts).replace(tzinfo=pytz.UTC) 2020-09-30 12:37:55.713351+00:00
    

    UTC+7 机器打印这个:

    GENERATING TIMESTAMP:
                                               time.time() 1601469478
                                datetime.now().timestamp() 1601469478
    datetime.utcnow().replace(tzinfo=pytz.UTC).timestamp() 1601469478
                             datetime.utcnow().timestamp() 1601444278
    
    GENERATING DATETIME FROM TIMESTAMP ts = 1601469478.637603
                             datetime.fromtimestamp(ts) 2020-09-30 19:37:58.637603
                datetime.fromtimestamp(ts, tz=pytz.UTC) 2020-09-30 12:37:58.637603+00:00
    datetime.fromtimestamp(ts).replace(tzinfo=pytz.UTC) 2020-09-30 19:37:58.637603+00:00
    

    您可以看到time.time() 应该在任何机器上返回相同的值,而不管该机器使用的时区如何。

    另外,假设 time.time() 已经从不同时区的地方调用,并在他们的机器上转换为 UTC 日期时间,他们都会给出相同的 UTC 时间吗?

    是的,实验结果倒数第二行显示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2013-01-11
      • 2015-12-04
      • 2013-05-09
      • 2021-11-20
      • 2013-11-17
      • 1970-01-01
      相关资源
      最近更新 更多